使用auto_now_add时如何让现有条目为空?

时间:2019-07-11 15:38:28

标签: django django-migrations

我在现有模型中添加了一个字段:

    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必须保持为空。

1 个答案:

答案 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