2014-09-10 6 views
20

Ich baue eine ziemlich einfache Anwendung, Forschung, in meinem Django-Projekt, das Django-CMS verwendet. (Es ist mein erster grundlegender Versuch eines Projekts/einer Anwendung.) Sein Hauptzweck besteht darin, verschiedene intellektuelle Vermögenswerte (d. H. Artikel, Buch usw., die von einem Forscher geschrieben wurden) zu speichern.Django: OperationalError Keine solche Tabelle

Das Problem ist, dass, wenn ich den Browser auf/Forschung/zeigen, bekomme ich eine Fehlermeldung, dass die Tabelle "research_journal" nicht existiert ("keine solche Tabelle").

Ich benutze Djnago 1.6.5 mit einer SQLite3-Datenbank.

Mit Blick auf python manage.py sql research ergibt:

BEGIN; 
CREATE TABLE "research_researchbase" (
    "id" integer NOT NULL PRIMARY KEY, 
    "pub_date" datetime NOT NULL, 
    "authors" varchar(200) NOT NULL, 
    "year" varchar(25) NOT NULL, 
    "title" varchar(200) NOT NULL, 
    "subtitle" varchar(200) NOT NULL, 
    "image_id" integer NOT NULL REFERENCES "filer_image" ("file_ptr_id"), 
    "link" varchar(200) NOT NULL 
) 
; 
CREATE TABLE "research_journal" (
    "researchbase_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "research_researchbase" ("id"), 
    "journal" varchar(200) NOT NULL, 
    "abstract" text NOT NULL, 
    "citation" varchar(200) NOT NULL 
) 
; 
CREATE TABLE "research_encyclopedia_chapter" (
    "researchbase_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "research_researchbase" ("id"), 
    "encyclopedia" varchar(200) NOT NULL, 
    "publisher" varchar(200) NOT NULL, 
    "summary" varchar(200) NOT NULL 
) 
; 
CREATE TABLE "research_book" (
    "researchbase_ptr_id" integer NOT NULL PRIMARY KEY REFERENCES "research_researchbase" ("id"), 
    "publisher" varchar(200) NOT NULL, 
    "summary" varchar(200) NOT NULL 
) 
; 

COMMIT; 

ich python manage.py migrate research habe laufen und bekommen:

/Users/XXX/Documents/repos/sfs/env/lib/python2.7/site-packages/app_data/fields.py:2: DeprecationWarning: django.utils.simplejson is deprecated; use json instead. 
    from django.utils import simplejson as json 

Running migrations for research: 
- Nothing to migrate. 
- Loading initial data for research. 
Installed 0 object(s) from 0 fixture(s) 

Ich habe python manage.py syncdb laufen und erhalten folgendes:

Syncing... 
Creating tables ... 
Installing custom SQL ... 
Installing indexes ... 
Installed 0 object(s) from 0 fixture(s) 

Synced: 
> djangocms_admin_style 
> django.contrib.auth 
> django.contrib.contenttypes 
> django.contrib.sessions 
> django.contrib.admin 
> django.contrib.sites 
> django.contrib.sitemaps 
> django.contrib.staticfiles 
> django.contrib.messages 
> mptt 
> south 
> sekizai 
> django_select2 
> hvad 

Not synced (use migrations): 
- djangocms_text_ckeditor 
- cms 
- menus 
- djangocms_style 
- djangocms_column 
- djangocms_file 
- djangocms_flash 
- djangocms_googlemap 
- djangocms_inherit 
- djangocms_link 
- djangocms_picture 
- djangocms_teaser 
- djangocms_video 
- reversion 
- polls 
- djangocms_polls 
- aldryn_blog 
- easy_thumbnails 
- filer 
- taggit 
- research 
(use ./manage.py migrate to migrate these) 

Hier ist die models.py:

from django.db import models 
from django.utils import timezone 
from filer.fields.image import FilerImageField 

import datetime 

class ResearchBase(models.Model): 
    pub_date = models.DateTimeField('date published') 
    authors = models.CharField(max_length=200) 
    year = models.CharField(max_length=25) 
    title = models.CharField(max_length=200) 
    subtitle = models.CharField(max_length=200, blank=True) 
    image = FilerImageField() 
    link = models.CharField(max_length=200, blank=True) 

    def __unicode__(self): 
     return self.title 

    def was_published_recently(self): 
     return self.pub_date >= timezone.now() - datetime.timedelta(days=1) 


class Journal(ResearchBase): 
    journal = models.CharField(max_length=200) 
    abstract = models.TextField() 
    citation = models.CharField(max_length=200) 


class Encyclopedia_Chapter(ResearchBase): 
    encyclopedia = models.CharField(max_length=200) 
    publisher = models.CharField(max_length=200) 
    summary = models.CharField(max_length=200) 


class Book(ResearchBase): 
    publisher = models.CharField(max_length=200) 
    summary = models.CharField(max_length=200) 

Hier ist mein views.py (beachten Sie, dass ich zwei Objekte durch machen bin vorbei, ignoriert die Tatsache, dass ich noch die Klasse Bücher in dem ganzen Deal enthalten müssen):

from django.shortcuts import render, get_object_or_404 
from django.http import HttpResponse, Http404 
from django.template import RequestContext, loader 

from research.models import Journal, Encyclopedia_Chapter, Book 

def research_index(request): 
    latest_journal_list = Journal.objects.order_by('-pub_date')[:5] 
    latest_chapter_list = Encyclopedia_Chapter.objects.order_by('-pub_date')[:5] 

    context = { 
     'latest_journal_list': latest_journal_list, 
     'latest_chapter_list': latest_chapter_list 
    } 

    return render(request, 'research/index.html', context) 

def journal_detail(request, journal_id): 
    journal = get_object_or_404(Journal, pk=journal_id) 
    return render(request, 'research/journal_detail.html', {'journal': journal}) 

def chapter_detail(request, chapter_id): 
    chapter = get_object_or_404(Encyclopedia_Chapter, pk=chapter_id) 
    return render(request, 'research/chapter_detail.html', {'chapter': chapter}) 

Hier ist die URL der Anwendung Py:

from django.conf.urls import patterns, url 

from research import views 

urlpatterns = patterns('', 
    url(r'^$', views.research_index, name='research'), 
    url(r'^(?P<journal_id>\d+)/$', views.journal_detail, name='journal_detail'), 
    url(r'^(?P<chapter_id>\d+)/$', views.chapter_detail, name='chapter_detail'), 
) 

Hier ist die index.html Vorlage:

{% extends 'research/base.html' %} 

{% block research_content %} 

<div class="container"> 
    <div class="row featurette"> 
     <h3 id="research">Peer-reviewed Journal Articles</h3> 
     {% if latest_journal_list %} 
      <ul id="research"> 
      {% for journal in latest_journal_list %} 
       <li id="research"> 
          <img src="{{ journal.image.url }}" id="research"> 
          <h4>{{ journal.journal }}</h4> 
          <h5>{{ journal.title }}</h5> 
          <a href="{% url 'research:journal_detail' journal.id %}">Read More</a> 
         </li> 
      {% endfor %} 
      </ul> 
     {% else %} 
      <p>No journals are available.</p> 
     {% endif %} 
    </div> 

    <div class="row featurette"> 
     <h3 id="research">Encyclopedia Chapters</h3> 
     {% if latest_chapter_list %} 
      <ul id="research"> 
      {% for chapter in latest_chapter_list %} 
       <li id="research"> 
          <img src="{{ chapter.image.url }}" id="research"> 
          <h4>{{ chapter.journal }}</h4> 
          <h5>{{ chapter.title }}</h5> 
          <a href="{% url 'research:chapter_detail' chapter.id %}">Read More</a> 
         </li> 
      {% endfor %} 
      </ul> 
     {% else %} 
      <p>No encyclopedia chapters are available.</p> 
     {% endif %} 
    </div> 
</div> 

{% endblock %} 

Nur für den Fall, dass es darauf ankommt, hier ist meine cms_app.py:

from cms.app_base import CMSApp 
from cms.apphook_pool import apphook_pool 
from django.utils.translation import ugettext_lazy as _ 


class ResearchApp(CMSApp): 
    name = _("Research App") 
    urls = ["research.urls"] 
    app_name = "research" 

apphook_pool.register(ResearchApp) 

Gedanken? Jede Hilfe würde sehr geschätzt werden.

+0

Haben Sie Python manage.py syncdb ausgeführt? – jabez

+0

Ja. Ich habe Python manage.py syncdb ausgeführt (hinzugefügtes Ergebnis zum Posten). Ich hatte den Eindruck, dass die Verwendung von "via-migrate" von South die Notwendigkeit zur Synchronisierung der Datenbank durch den oben genannten Befehl beseitigt hat. Ist das falsch? – Brian

+0

Haben Sie versucht, DB und syncDB erneut zu löschen? – ppolak

Antwort

9

Es scheint, dass es ein Problem mit meiner Migration gab.

Ich lief ./manage.py schemamigration research --auto und festgestellt, dass viele der Felder keinen Standard angegeben hatte.

So lief ich ./manage.py schemamigration research --init gefolgt von ./manage.py migrate research

Erneutes Ausführen des Servers von dort den Trick!

+15

'manage.py migrieren --run-syncdb' arbeitete für mich – erbdex

0

Ich verwende Django 1.9, SQLite3 und DjangoCMS 3.2 und hatte das gleiche Problem. Ich habe es gelöst, indem ich python manage.py makemigrations ausgeführt habe. Darauf folgte eine Abfrage, dass die Datenbank Nicht-Null-Werttypen enthielt, aber keinen Standardwert hatte. Es gab mir zwei Möglichkeiten: 1) wähle jetzt einen einmaligen Wert oder 2) beende und ändere die Standardeinstellung in models.py. Ich wählte die erste Option und gab den Standardwert von 1 an. Wiederholte dies vier oder fünf Mal, bis die Eingabeaufforderung sagte, dass es beendet sei. Ich lief dann python manage.py migrate. Jetzt funktioniert es gut. Denken Sie daran, indem Sie zunächst python manage.py makemigrations ausführen, wird eine überarbeitete Kopie der Datenbank erstellt (meine war 0004), und Sie können jederzeit zu einem vorherigen Datenbankstatus zurückkehren.

51

This comment auf dieser Seite arbeitete für mich und ein paar andere.Es verdient eine eigene Antwort:

python manage.py migrate --run-syncdb 
+0

Vergessen Sie nicht,' python makemigrations' zuerst auszuführen –

0

Ich benutze Django CMS 3.4 mit Django 1.8. Ich ging durch die Ursache im Django CMS-Code. Hauptursache ist, dass der Django-CMS das Verzeichnis vor dem Ausführen von Datenbankaufrufen nicht in das Verzeichnis mit der Datei mit der SQLite3-Datenbank ändert. Die Fehlermeldung ist falsch. Das zugrunde liegende Problem besteht darin, dass ein SQLite-Datenbankaufruf im falschen Verzeichnis ausgeführt wird.

Die Problemumgehung besteht darin, sicherzustellen, dass alle Ihre Django-Anwendungen das Verzeichnis zurück in das Stammverzeichnis von Django Project ändern, wenn sie in Arbeitsverzeichnisse wechseln.

12

Für django 1.10 müssen Sie möglicherweise python manage.py makemigrations appname tun.