django中的迁移命令在部署到heroku时出现错误



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

虽然部署过程成功完成,但是migrate命令给出了一个错误。

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 = [...]

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

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

Django允许很容易地自定义认证[Django docs]/user模型。一般来说,作为Django的最佳实践,应该总是在启动项目时使用自定义用户模型。

你的解决方案是删除你所有的迁移,删除数据库,重新安装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)和视图中的一些表单以及重构代码。

最新更新