Ответ 1
Я только что научился делать это с помощью одного переноса!
при запуске makemigrations
django должен попросить вас установить одноразовое значение по умолчанию. Определите, что вы можете здесь сделать, чтобы он был счастлив, и вы в конечном итоге с помощью миграции AddField
, которую вы упомянули.
migrations.AddField(
model_name='series',
name='updated_as',
field=models.DateTimeField(default=????, auto_now=True),
),
Измените эту операцию на 3 операции:
- изначально сделать поле нулевым, поэтому будет добавлен столбец.
- вызовите функцию для заполнения поля по мере необходимости.
- измените поле (с помощью
AlterField
), чтобы сделать его недействительным (например, выше, без значения по умолчанию).
чтобы вы получили что-то вроде.
migrations.AddField(
model_name='series',
name='updated_as',
field=models.DateTimeField(null=True, auto_now=True),
),
migrations.RunPython(set_my_defaults),
migrations.AlterField(
model_name='series',
name='updated_as',
field=models.DateTimeField(auto_now=True),
),
с вашей функцией, определенной как что-то вроде:
def set_my_defaults(apps, schema_editor):
Series = apps.get_model('myapp', 'Series')
for series in Series.objects.all().iterator():
series.updated_as = datetime.now() + timedelta(days=series.some_other_field)
series.save()
кроме, вы знаете, не страшно.