español - Django: OperationalError No existe tal tabla
django cms tutorial (7)
Estoy construyendo una aplicación bastante simple, investigación, en mi proyecto Django que usa Django-CMS. (Es mi primer intento innovador en un proyecto / aplicación). Su propósito principal es almacenar varios activos intelectuales (es decir, un artículo, un libro, etc., escritos por un investigador).
El problema es que cuando apunto el navegador a / research / me aparece un error que dice que la tabla ''research_journal'' no existe ("no existe dicha tabla").
Estoy usando Djnago 1.6.5 con una base de datos sqlite3.
En cuanto a los python manage.py sql research
:
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;
He ejecutado python manage.py migrate research
y obtengo:
/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)
He ejecutado python manage.py syncdb
y obtengo lo siguiente:
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)
Aquí está el 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)
Aquí está mi views.py (tenga en cuenta que estoy pasando dos objetos a través del renderizado, ignore el hecho de que todavía no he incluido los libros de la clase):
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})
Aquí está url.py de la aplicación:
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''),
)
Aquí está la plantilla 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 %}
Por si acaso importa, aquí está mi 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)
¿Pensamientos? Cualquier ayuda sería muy apreciada.
El problema se puede resolver ejecutando migraciones.
-
python manage.py makemigrations
-
python manage.py migrate
realice las operaciones anteriores siempre que haga cambios en models.py
.
Esto me sucedió y para mí fue porque agregué db.sqlite3
como no db.sqlite3
desde el repositorio. Lo agregué y lo llevé al servidor para que funcionara correctamente. También ejecuta makemigartions
y migrate
después de hacer esto.
Estoy usando Django 1.9, SQLite3 y DjangoCMS 3.2 y tuve el mismo problema. Lo resolví ejecutando python manage.py makemigrations
. A esto siguió un aviso que indicaba que la base de datos contenía tipos de valores no nulos pero no tenía un conjunto de valores predeterminado. Me dio dos opciones: 1) seleccionar un valor único ahora o 2) salir y cambiar la configuración predeterminada en models.py. Seleccioné la primera opción y le di el valor predeterminado de 1. Repetí esto cuatro o cinco veces hasta que el mensaje indicara que había finalizado. Luego corrí python manage.py migrate
. Ahora funciona bien. Recuerde, al ejecutar python manage.py makemigrations
primero, se crea una copia revisada de la base de datos (la mía era 0004) y siempre puede volver al estado de la base de datos anterior.
Estoy usando Django CMS 3.4 con Django 1.8. Caminé a través de la causa raíz en el código de Django CMS. La causa principal es que el CMS de Django no está cambiando el directorio al directorio con el archivo que contiene la base de datos SQLite3 antes de hacer llamadas a la base de datos. El mensaje de error es falso. El problema subyacente es que una llamada de base de datos SQLite se realiza en el directorio incorrecto.
La solución es asegurar que todas sus aplicaciones Django cambien de nuevo el directorio al directorio raíz del Proyecto Django cuando cambien a directorios de trabajo.
Para django 1.10 puede que tengas que hacer python manage.py makemigrations appname
.
Parece que hubo un problema con mi migración.
Corrí ./manage.py schemamigration research --auto
y encontré que muchos de los campos no tenían un valor predeterminado especificado.
Por lo tanto, corrí ./manage.py schemamigration research --init
seguido por ./manage.py migrate research
¡Correr el servidor desde allí hizo el truco!
Este comentario en esta página funcionó para mí y para algunos otros. Merece su propia respuesta:
python manage.py migrate --run-syncdb