49

升级到 Django 1.8(使用 zc.buildout)并运行 syncdb 或 migrate 时,我收到以下消息:

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 对象吗?

4

8 回答 8

99

我通过先运行 auth 来解决这个问题,然后是我的其余迁移:

python manage.py migrate auth
python manage.py migrate
于 2015-04-29T10:47:48.883 回答
19

在我的环境中,我修复了在与以下makemigrations相关的所有应用程序上运行的问题django.contrib.auth.models

manage.py makemigrations app_with_user_relation
manage.py 迁移
于 2015-05-04T13:19:33.707 回答
8

如果你像我一样使用 heroku

heroku run python manage.py makemigrations

这可能会给您一条消息,说明现在有更改。忽略然后运行

heroku run python manage.py migrate

这会给你一些输出,表明已经完成了一些事情。最后运行

heroku run python manage.py createsuperuser
于 2015-05-30T09:22:42.667 回答
8

对所有尚未迁移的应用程序运行“makemigrations”可以解决此问题,即迁移目录中还没有“initial_0001.py”文件的应用程序。

这是通过为每个应用程序运行来完成的(在我们的例子中,我们使用一个 makefile):

manage.py makemigrations app_name

完成后,您可以执行:

manage.py migrate

照常。

造成这种情况的根本原因是由于某种原因

manage.py makemigrations

如果它们不存在,则并不总是创建这些初始迁移。这导致了上述错误。

相反,

manage.py makemigrations app_name

总是创建它们(如果还没有的话)不幸的是,我无法理解这种不对称的原因。

于 2016-01-14T12:21:37.533 回答
4

为了解决这个问题,我所做的是:

1) 在你的项目中找到所有外键关系字段,如 OneToOneField、ForeignKey 和 ManyToManyFields,包括任何引用auth.User或导入 User 的可重用应用程序,并将其设置为 settings.AUTH_USER_MODEL 如上所述。最少使用:

'auth.User'

2)对于所有具有上述条件的模型,确保模型具有有效的 django 迁移(不是南)。如果他们有南迁移,请将目录重命名为 migrations_south,然后为该应用运行 makemigrations 命令:

./manage.py makemigrations affected_app

有时会有一个不同名称的 django 迁移文件夹,而不是默认migrations目录。在这种情况下,MIGRATION_MODULES请在您的 settings.py 中引用它:

MIGRATION_MODULES = {'filer': 'filer.migrations_django'}

由于在大型项目中很难找到该问题,因此我在 settings.py 中注释掉了所有自定义应用程序INSTALLED_APPS并运行了 test 命令,因为它将运行 migrate 并尝试为您重新创建数据库:

./manage.py test

看起来这对我来说是固定的。我不确定第 1 步是强制性的还是只是最佳实践。但是您肯定需要将应用程序转换为迁移。

干杯!

PS。为即将到来的Django 1.9做好准备。syncdb 命令将被删除。无需迁移即可同步应用的传统方法已被删除,所有应用都必须进行迁移。

于 2015-04-22T21:47:49.153 回答
0

尝试使用这个来引用用户

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)
于 2015-04-17T02:59:25.557 回答
0

也许您已经找到了答案并解决了问题,但我想指出,就我而言,上述问题已通过删除数据库并以用户的全部权限重新创建它来解决。我能够这样做是因为我在非生产环境中工作,但是在暂存环境中这样做并不是一个好主意,所以要小心。

我使用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
于 2017-01-31T21:46:30.500 回答
0

我已经将一个旧的 Django 1.6 项目迁移到了 Django 1.8,之前我们使用了 syncdb 来迁移数据库,并且我们没有针对我们项目中的所有应用程序进行初始迁移步骤。使用 Django 1.8,您将需要一个有效的数据库迁移。跑步

manage.py makemigrations <app_name>

我们项目中的所有应用程序都解决了我们的问题。

于 2016-09-14T10:36:27.017 回答