从Django 1.6升级到1.9:python manage.py迁移失败

编程入门 行业动态 更新时间:2024-10-27 12:40:48
本文介绍了从Django 1.6升级到1.9:python manage.py迁移失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在生产环境中运行Django 1.6.6,最近已在登台(开发服务器)上升级到1.9.7。此更新是在服务器上执行的,我按照此处概述的步骤从南部升级。

I'm running Django 1.6.6 on production and have recently upgraded to 1.9.7 on staging (dev server). This update was performed on the server and I followed the steps outlined here Upgrading from South.

我注意到迁移文件的结构已更改,并且不再包含 create 语句。这会引起问题,因为如果我从GitHub存储库中提取此新代码并运行 python manage.py makemigrations 或 python manage.py migration ,它说:

I noticed that the structure of the migration files have changed, and they no longer include a create statement. This causes issues because if I pull this new code from my GitHub repo and run python manage.py makemigrations or python manage.py migrate, it says:

django.db.utils.OperationalError:没有这样的表:appname_modelname

回溯指向我的urls.py,因为我在查询集中引用了模型:

The traceback points to my urls.py because I'm referencing the model in a queryset:

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

在1.9升级之前, syncdb 为我创建了表,但迁移。我也尝试过 python manage.py migration --run-syncdb ,但这给出了相同的错误。

Prior to the 1.9 upgrade, syncdb created the tables for me, but this isn't the case with migrate. I've also tried python manage.py migrate --run-syncdb but this gives the same error.

但是,如果我将SQLite数据库从生产或暂存环境复制到本地计算机并运行该命令,则该命令将起作用(因为该表已在数据库中)。

However, if I copy the SQLite database from my production or staging environments to my local machine and run the command, it works (because the table is already in the database).

我是否必须手动创建这些表(尽管我认为不是),或者我做错了什么?

Do I have to manually create these tables (though I assume not) or am I doing something wrong?

编辑:添加了代码段和回溯。抱歉,最初没有这样做。

Added code snippets and tracebacks. Sorry for not doing this initially.

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'),

...

回溯

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`

推荐答案

问题是加载 urls.py 时,正在评估您的查询集。当您为新项目运行 makemigrations 时,这会导致错误,因为尚未创建表。

The problem is that your queryset is being evaluated when the urls.py loads. When you run makemigrations for a new project, this causes the error because the table has not been created yet.

您可以通过子类化 ListView 并将查询集移到 get_queryset 来解决此问题。

You can fix this by subclassing ListView and moving the queryset into get_queryset.

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

然后更改您的网址格式以使用新视图。

Then change your url pattern to use your new view.

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

Django 1.9运行一些检查来验证您的网址格式,这意味着网址格式是在 makemigrations 命令运行。 Django 1.8没有这些检查,因此您可以像完成操作一样设置查询集。

Django 1.9 runs some checks to validate your url patterns, which means that the url patterns are loaded before the makemigrations command runs. Django 1.8 does not have these checks, so you can get away with setting the queryset as you have done.

更多推荐

从Django 1.6升级到1.9:python manage.py迁移失败

本文发布于:2023-10-28 08:49:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1536143.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:升级到   Django   py   manage   python

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!