Django 1.8和syncdb / migrate引发的auth_user错误
升级到Django 1.8(使用zc.buildout)并运行syncdb或迁移时,我收到以下消息:
django.db.utils.ProgrammingError: relation "auth_user" does not exist
我的一个模型包含django.contrib.auth.models.User:
user = models.ForeignKey( User, related_name='%(app_label)s_%(class)s_user', blank=True, null=True, editable=False )
降级到Django 1.7将消除错误。 我必须在Django 1.8中包含User对象吗?
我通过首先运行auth来解决这个问题,然后是我的其他迁移:
python manage.py migrate auth python manage.py migrate
在我的环境中,我修复了所有与django.contrib.auth.models
有关系的应用程序的运行makemigrations
:
manage.py makemigrations app_with_user_relation manage.py迁移
我也有同样的问题,我解决了这个问题:
python manage.py migrate auth python manage.py migrate
然后迁移做它的工作
如果你正在使用heroku就像我运行
heroku run python manage.py makemigrations
这可能会给你一个消息,说现在有变化。 忽略然后运行
heroku run python manage.py migrate
这会给你一些输出build议已经做了一些事情。 最后跑
heroku run python manage.py createsuperuser
通过为所有尚未迁移的应用运行“makemigrations”,即在其迁移目录中还没有“initial_0001.py”文件的应用程序中包含此问题。
这是通过为每个应用程序运行完成的(在我们的例子中,我们使用一个makefile):
manage.py makemigrations app_name
一旦完成,您可以执行:
manage.py migrate
照常。
造成这种情况的根本原因是由于某种原因
manage.py makemigrations
并不总是创build这些最初的迁移,如果他们不在那里。 这导致了提到的错误。
反之,
manage.py makemigrations app_name
总是创build它们(如果还没有的话)。 不幸的是我无法理解这种不对称的原因。
要解决这个问题,就是我所做的:
1)find项目中的所有外键关系字段,如OneToOneField,ForeignKey和ManyToManyFields,包括任何引用auth.User
或导入User的可重用应用程序,并将其设置为如上所述的settings.AUTH_USER_MODEL。 至less使用:
'auth.User'
2)对于所有具有上述模型,确保模型有一个有效Django的迁移(不南)。 如果他们有南迁移,请将目录重命名为migrations_south,然后为该应用程序运行makemigrations命令:
./manage.py makemigrations affected_app
有时在不同的名称下有一个django migrations文件夹,而不是默认的migrations
目录。 在这种情况下,请在settings.py中通过MIGRATION_MODULES
参考:
MIGRATION_MODULES = {'filer': 'filer.migrations_django'}
由于这个问题很难在较大的项目上find,我在settings.py中将INSTALLED_APPS
中的所有自定义应用程序注释掉,然后运行test命令,因为它将运行迁移并尝试为您重新创build数据库:
./manage.py test
看起来像是给我修好了 我不确定第1步是强制还是最佳实践。 但是,您肯定需要将应用程序转换为迁移。
干杯!
PS。 准备好在Django 1.9中发布的内容 。 syncdb命令将被删除。 在没有迁移的情况下同步应用程序的传统方法将被删除,并且所有应用程序都必须进行迁移。
尝试引用使用此的用户
from django.conf import settings user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='%(app_label)s_%(class)s_user', blank=True, null=True, editable=False)
我已经将旧的Django 1.6项目迁移到了Django 1.8,之前我们已经使用syncdb来迁移数据库,并且我们没有为项目中的所有应用程序初始迁移步骤 。 使用Django 1.8,您将需要一个正在运行的数据库迁移。 运行
manage.py makemigrations <app_name>
对于我们项目中的所有应用程序修复了我们的问
也许你已经find了答案,并解决了这个问题,但是我想指出的是,就我而言,上面的问题是通过删除数据库并重新创build它,并以用户的全部特权来解决的。 我能够做到这一点是因为我在非生产环境下工作,但是在临时环境中这样做并不是一个好主意,所以要小心。
我使用python 2.7.12
和以下是我的virtualenv的规格:
Django==1.10.5 django-crispy-forms==1.6.1 django-registration-redux==1.4 djangorestframework==3.5.3 olefile==0.44 packaging==16.8 Pillow==4.0.0 psycopg2==2.6.2