【问题标题】:Migrate command in django giving error when deployed to herokudjango中的迁移命令在部署到heroku时出错
【发布时间】:2021-10-05 14:58:24
【问题描述】:

所以我试图将一个 django 应用程序部署到 heroku,它在本地运行良好。

虽然部署过程成功完成,但迁移命令出错。

django.db.migrations.exceptions.NodeNotFoundError: Migration accounts.0001_initial dependencies reference nonexistent parent node ('auth', '0013_alter_user_email')

这是我的迁移文件;

import accounts.models
from django.conf import settings
import django.contrib.gis.db.models.fields
from django.db import migrations, models
import django.db.models.deletion
from django.contrib.postgres.operations import CreateExtension


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ('auth', '0013_alter_user_email'),
    ]

    operations = [...]

从 cmets 中的讨论看来,0013_alter_user_email 迁移实际上并不存在于 auth 应用程序中。生成它是因为我在运行时使用User._meta.get_field('email').unique 访问它来修改用户模型以使电子邮件字段唯一。

【问题讨论】:

  • 您是否尝试删除所有迁移,然后再次重新迁移??
  • 是的,试过了。它在本地运行良好。
  • auth 应用在哪里?您是否将其包含在您的部署中?
  • 它来自 django (django.contrib.auth)。所以我认为它应该与 django 一起安装
  • 对不起,我没有。不过有一件事,您可以尝试将依赖关系更改为0001auth。我记得模糊地有一个类似的问题,它不会在本地发生。我通过使用它的第一次迁移首先加载依赖项来修复它。如果没有帮助,您可以显示迁移文件的其余部分吗?

标签: python django heroku deployment migrate


【解决方案1】:

您正在运行时修改用户模型,导致为其生成迁移。这种做事方式称为monkey patching,这是一种不好的做法django.contrib.auth 可以说是第 3 方应用程序,像这样修改它可能会产生您目前正在经历的不利影响。发生的事情是您修改了用户模型,它在 Django 包中本地生成了迁移。由于这是一个包,它不是您的代码的一部分,而是单独安装的。你甚至不能在 Heroku 上运行 makemigrations 来解决这个问题(无论如何都不是推荐的解决方案),因为 Heroku 上的任何文件系统更改都是临时的,并且会在 dyno 加载时被删除。

Django 允许一个customize authentication [Django docs]/用户模型非常容易。一般来说,作为 Django 的最佳实践,应该始终 use a custom user model when starting a project

您的解决方案是删除所有迁移,删除数据库,重新安装 Django 以确保它是干净且未经修改的,并使用如上所述的自定义用户模型:

from django.contrib.auth.models import AbstractUser
from django.utils.translation import gettext_lazy as _


class User(AbstractUser):
    email = models.EmailField(_('email address'), blank=True, unique=True)

在设置中将此设置为AUTH_USER_MODEL [Django dosc]。还需要进行其他更改,例如为管理站点注册模型、更改ModelAdmin(即UserAdmin)中的某些表单以及视图和重构代码。

【讨论】:

  • 在这里,我只想让电子邮件与众不同。那么如果我写一些条件,比如过滤从用户收到的电子邮件并检查它是否存在,然后只允许新的。这会是一个好习惯吗?
  • @Irfanwani 是的,如果需要,您可以自己编写一些验证代码,尽管设置 unique=True 应该使 Django 表单等自动执行此操作。最好使用自定义用户模型。
  • 做同样的事情。感谢您的帮助。
  • BTW 是 _('email address') 你用的只是一个冗长的名字还是有什么特殊含义
  • @Irfanwani 它的冗长名称只是使用_ 来保持它的可翻译性。它是直接从源代码复制的。 _ 如果您看到上面的导入实际上是 django.utils.translation.gettext_lazy,因此如果启用并使用翻译,那么详细名称将被翻译为活动语言。
猜你喜欢
  • 2015-03-31
  • 2017-01-23
  • 2011-08-11
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2013-04-14
相关资源
最近更新 更多