我在现有模型中添加了一个字段:
creation_date = models.DateTimeField(
auto_now_add=True,
blank=True, null=True)
makemigrations后生成的文件看起来像
migrations.AddField(
model_name='document',
name='creation_date',
field=models.DateTimeField(auto_now_add=True, null=True),
),
应用迁移时,auto_now_add将应用于所有现有条目。
如何避免这种情况?应用迁移之前,所有记录的数据的creation_date必须保持为空。
答案 0 :(得分:1)
最简单的方法可能是在迁移文件中还原迁移。因此,您首先运行:
./manage.py makemigration
但是您不(!)仍要迁移。然后,您可以检查迁移文件,并将其更改为:
# Generated by Django 2.2.2 on 2019-07-11 15:55
from django.db import migrations, models
def set_to_null(apps, schema_editor):
SomeModel = apps.get_model("app", "SomeModel")
SomeModel.objects.update(creation_date=None)
class Migration(migrations.Migration):
dependencies = [
('app', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='somemodel',
name='creation_date',
field=models.DateTimeField(auto_now_add=True, null=True),
),
migrations.RunPython(set_to_null),
]
然后,您可以迁移数据库。它将首先构造一个额外的字段,然后将现有记录的creation_date
的{{1}}列设置为set_to_null
。