在Django中迁移`DateTimeField`到`DateField`

d8tt03nd  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(116)

我有一个对象,它的属性是DateTimeField,现在我想把它改成DateField
但是我的数据库中已经有数据了,所以只需要执行此迁移:

migrations.AlterField(
        model_name='assignedtip',
        name='date',
        field=models.DateField(),
    ),

不会工作,因为table后来被打破了。
如何确保在使用makemigration执行此迁移时,首先将DateTimeField值转换为DateFields

8cdiaqws

8cdiaqws1#

我认为,最好分四步来做:
1.首先添加包含NULL的字段assignedtip_date作为开始;
1.然后运行 * 数据迁移 *,用assignedtip的截断部分填充字段;
1.然后删除assginedtip字段;和
1.最后将assginedtip_date字段重命名为assignedtip
因此,迁移看起来像:

# app_name/migrations/0123_some_name.py

from django.db import migrations, models
from django.db.models.functions import TruncDate

def migrate_date(apps, schema_editor):
    MyModel = apps.get_model("app_name", "MyModel")
    MyModel.objects.update(assignedtip_date=TruncDate('assignedtip'))

class Migration(migrations.Migration):
    dependencies = [("migrations", "0001_initial")]

    operations = [
        migrations.AddField(
            "MyModel", "assignedtip_date", models.DateField(null=True)
        ),
        migrations.RunPython(migrate_date),
        migrations.RemoveField("MyModel", "assignedtip"),
        migrations.RenameField("MyModel", "assignedtip_date", "assignedtip"),
    ]

相关问题