2016-06-09 16 views
5

Ich habe Django 1.6.6 auf Produktion und vor kurzem auf 1.9.7 auf Staging (dev Server) aktualisiert. Dieses Update wurde auf dem Server durchgeführt und ich befolgte die hier beschriebenen Schritte Upgrading from South.Upgrade von Django 1.6 auf 1.9: Python manage.py migrieren Fehler

Ich habe festgestellt, dass sich die Struktur der Migrationsdateien geändert hat und sie keine create-Anweisung mehr enthalten. Dies verursacht Probleme, weil, wenn ich diesen neuen Code aus meinem GitHub Repo ziehen und laufen python manage.py makemigrations oder python manage.py migrate, heißt es:

django.db.utils.OperationalError: no such table: appname_modelname

Die Zurückverfolgungspunkte auf meine urls.py, weil ich das Modell in einem queryset bin Referenzierung :

queryset=list(chain(models.modelname.objects.filter(booleanField=True).order_by(object), models.aDifferentModel.objects.all())),

Vor dem 1.9 Upgrade erstellt syncdb die Tabellen für mich, aber das ist nicht der Fall mit migrate. Ich habe auch versucht python manage.py migrate --run-syncdb, aber das gibt den gleichen Fehler.

Wenn ich jedoch die SQLite-Datenbank von meinen Produktions- oder Staging-Umgebungen auf meine lokale Maschine kopiere und den Befehl ausführe, funktioniert dies (weil die Tabelle bereits in der Datenbank vorhanden ist).

Muss ich diese Tabellen manuell erstellen (obwohl ich nicht davon ausgehe) oder mache ich etwas falsch?

Bearbeiten: Code-Schnipsel und Tracebacks hinzugefügt. Tut mir leid, dass ich das anfangs nicht gemacht habe.

models.py

class HowToApply(models.Model): 
    title = models.CharField(max_length=500, blank=True, null=True) 
    notice = models.TextField(blank=True, null=True) 
description = models.TextField(blank=True, null=True) 
active = models.BooleanField(default=None) 
image = models.FileField(upload_to='numeric/img/%Y', blank=True, null=True) 
mobile_image = models.FileField(upload_to='mobile/img/%Y', blank=True, null=True) 
sequence_number = models.IntegerField(unique=True) 

...

urls.py

from django.conf.urls import patterns, include, url 
from django.views.generic import RedirectView, TemplateView, ListView, CreateView 
from numeric import models, forms, views 
from honeypot.decorators import check_honeypot 
from numeric.views import CheckDeviceView 
from itertools import chain 

urlpatterns = patterns('', 
    url(r'^academy/howtoapply/$', 
     ListView.as_view(
      queryset = list(chain(models.HowToApply.objects.filter(active=True).order_by('sequence_number'), models.AcademyAdmin.objects.all())), 
     template_name = 'numeric/apply.html' 
    ), 
    name='apply'), 

...

Zurückverfolgungs

Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 350, in execute_from_command_line 
    utility.execute() 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 342, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/management/base.py", line 348, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/management/base.py", line 398, in execute 
    self.check() 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/management/base.py", line 426, in check 
    include_deployment_checks=include_deployment_checks, 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/checks/registry.py", line 75, in run_checks 
    new_errors = check(app_configs=app_configs) 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/checks/urls.py", line 10, in check_url_config 
    return check_resolver(resolver) 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/checks/urls.py", line 19, in check_resolver 
    for pattern in resolver.url_patterns: 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/utils/functional.py", line 33, in __get__ 
    res = instance.__dict__[self.name] = self.func(instance) 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 417, in url_patterns 
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/utils/functional.py", line 33, in __get__ 
    res = instance.__dict__[self.name] = self.func(instance) 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/core/urlresolvers.py", line 410, in urlconf_module 
    return import_module(self.urlconf_name) 
    File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/var/www/website_mig/project/urls.py", line 14, in <module> 
    (r'^', include('numeric.urls')), 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/conf/urls/__init__.py", line 52, in include 
    urlconf_module = import_module(urlconf_module) 
    File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/var/www/website_mig/numeric/urls.py", line 144, in <module> 
    queryset = list(chain(models.HowToApply.objects.filter(active=True).order_by('sequence_number'), models.AcademyAdmin.objects.all())), 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/models/query.py", line 258, in __iter__ 
    self._fetch_all() 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/models/query.py", line 1074, in _fetch_all 
    self._result_cache = list(self.iterator()) 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/models/query.py", line 52, in __iter__ 
    results = compiler.execute_sql() 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 852, in execute_sql 
    cursor.execute(sql, params) 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/utils.py", line 95, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
    File "/var/www/website_mig/venv/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 323, in execute 
    return Database.Cursor.execute(self, query, params) 
django.db.utils.OperationalError: no such table: numeric_howtoapply` 
+0

Der Verwaltungsbefehl 'migrieren 'sollte definitiv die Tabellen für Sie erstellen. Warum sind URLs?py' wird sogar importiert, wenn versucht wird, die Migrationen auszuführen? –

+0

haben Sie versucht, python manage.py makemigrations ''? – DeepSpace

+0

Sie sollten in Ihrem urls.py keine Fragen stellen. –

Antwort

4

Das Problem ist, dass Ihr queryset wenn die urls.py Lasten ausgewertet wird. Wenn Sie makemigrations für ein neues Projekt ausführen, verursacht das den Fehler, da die Tabelle noch nicht erstellt worden ist.

Sie können dies beheben, indem Sie ListView erstellen und das Abfrage-Set in get_queryset verschieben.

class MyListView(ListView): 
    template_name = 'numeric/apply.html' 

    def get_queryset(self): 
     return list(chain(models.HowToApply.objects.filter(active=True).order_by('sequence_number'), models.AcademyAdmin.objects.all())) 

Dann ändern Sie Ihr URL-Muster, um Ihre neue Ansicht zu verwenden.

url(r'^academy/howtoapply/$', 
    MyListView.as_view(), 
    name='apply', 
), 

Django 1.9 laufen einige prüfen Ihr URL-Muster zu validieren, was bedeutet, dass die URL-Muster vor den Läufen makemigrations Befehls geladen werden. Django 1.8 verfügt nicht über diese Überprüfungen, so dass Sie das Setzen des Anfragesatzes wie gewohnt durchführen können.

+0

Diese Lösung ist perfekt! Ich danke dir sehr! –

+2

Ich habe das gleiche Problem auf eine etwas andere Art und Weise. Check lädt urls.py, dann lädt sets.py, dann lädt forms.py und dann hat eines der Formulare ein ModelChoiceField und dies verursacht eine Exception wegen des queryset-Parameters. Gibt es da irgendwie um das zu umgehen? Wird ModelChioceFields queryset in Django 1.9 anders behandelt? – thelinuxer

+0

@thelinuxer, soweit ich weiß, sollte ModelChoiceFields kein Problem verursachen. Ich würde eine neue Frage stellen und den Code und die Rückverfolgung einschließen. – Alasdair

Verwandte Themen