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