2014-09-10 16 views
20

Sto costruendo un'applicazione abbastanza semplice, la ricerca, nel mio progetto Django che utilizza Django-CMS. (È il mio primo tentativo a terra su un progetto/applicazione.) Lo scopo principale è archiviare vari beni intellettuali (cioè articolo, libro, ecc. Scritti da un ricercatore).Django: OperationalError No Such Table

Il problema è che quando indico il browser a/ricerca/viene visualizzato un errore che dice che la tabella 'research_journal' non esiste ("nessuna tabella di questo tipo").

Sto utilizzando Djnago 1.6.5 con un database sqlite3.

Guardando python manage.py sql research rendimenti:

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; 

Ho eseguito python manage.py migrate research e ottengo:

/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) 

Ho eseguito python manage.py syncdb e ottenere il seguente:

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) 

Qui sta la 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) 

Ecco la mia views.py (nota che sto passando due oggetti attraverso il rendering, ignorare il fatto che devo ancora includere la classe Libri in tutto l'accordo):

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}) 

Qui URL dell'applicazione .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'), 
) 

Ecco il modello index.html:

{% 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 %} 

Nel caso in cui sia importante, ecco il mio 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) 

Pensieri? Qualsiasi aiuto sarebbe molto apprezzato.

+0

Hai eseguito python manage.py syncdb? – jabez

+0

Sì. Ho eseguito python manage.py syncdb (aggiunto il risultato al post). Ho avuto l'impressione, tuttavia, che l'utilizzo di south via migrate eliminasse la necessità di sincronizzare il database tramite il comando sopra menzionato. È sbagliato? – Brian

+0

Hai provato a rilasciare nuovamente DB e syncDB? – ppolak

risposta

9

Sembra che ci sia stato un problema con la mia migrazione.

Ho eseguito ./manage.py schemamigration research --auto e ho riscontrato che molti dei campi non avevano un valore predefinito specificato.

Così, mi sono imbattuto ./manage.py schemamigration research --init seguito da ./manage.py migrate research

Riesecuzione server da lì ha fatto il trucco!

+15

'manage.py migrate --run-syncdb' ha funzionato per me – erbdex

0

Sto utilizzando Django 1.9, SQLite3 e DjangoCMS 3.2 e ho riscontrato lo stesso problema. L'ho risolto eseguendo python manage.py makemigrations. Questo è stato seguito da un messaggio che indicava che il database conteneva tipi di valori non nulli ma non aveva un valore predefinito impostato. Mi ha dato due opzioni: 1) seleziona un valore uno off ora o 2) esci e cambia l'impostazione predefinita in models.py. Ho selezionato la prima opzione e ho dato il valore predefinito di 1. Ripetuto questo quattro o cinque volte fino a quando il prompt ha detto che era finito. Ho quindi eseguito python manage.py migrate. Ora funziona bene. Ricorda, eseguendo prima python manage.py makemigrations, viene creata una copia revisionata del database (il mio era 0004) e puoi sempre tornare a uno stato precedente del database.

51

This comment su questa pagina ha funzionato per me e pochi altri.Merita la sua risposta:

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

Non dimenticare di eseguire' python makemigrations' prima –

0

Sto utilizzando Django CMS 3.4 con Django 1.8. Ho analizzato la causa principale nel codice CMS di Django. La causa principale è il Django CMS che non modifica la directory nella directory con il file contenente il database SQLite3 prima di effettuare chiamate al database. Il messaggio di errore è spurio. Il problema di fondo è che una chiamata al database SQLite viene effettuata nella directory sbagliata.

La soluzione è di garantire che tutte le applicazioni Django cambino directory alla directory principale del progetto Django quando si passa alle directory di lavoro.

12

Per django 1.10 potrebbe essere necessario fare python manage.py makemigrations appname.

Problemi correlati