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

How to let existing entries empty when using auto_now_add?

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

    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 应用迁移前记录的所有数据必须保持为空。

最简单的可能是在迁移文件中恢复迁移。所以你先 运行:

./manage.py <b>makemigrations</b>

但您没有 (!) 迁移。然后您可以检查迁移文件,并将其更改为:

# Generated by Django 2.2.2 on 2019-07-11 15:55

from django.db import migrations, models


def <b>set_to_null</b>(apps, schema_editor):
    <b>SomeModel</b> = apps.get_model("app", "SomeModel")
    SomeModel.objects.update(<b>creation_date=None</b>)


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(<b>set_to_null</b>),
    ]

然后你就可以迁移你的数据库了。它将首先构造一个额外的字段,然后将 creation_date 列设置为 NULL.

现有记录的 set_to_null