我有一个属性为DateTimeField的对象,现在我想将其更改为DateField.

但是我的数据库中已经有数据,所以只需执行此迁移:

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

不会起作用的,因为后来桌子被打破了.

如何确保在使用makemigration执行此迁移时,首先将DateTimeField值转换为DateFields

推荐答案

我认为分四步来做可能更好:

  1. 首先添加包含用于开始的NULL的字段assignedtip_date
  2. 然后运行data migration,用assignedtip的截断部分填充字段;
  3. 然后删除assginedtip字段;以及
  4. 最后,将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"),
    ]

Django相关问答推荐

Django模型ManyToManyField.Add不起作用

Django/SendGrid-密码重置-发件人地址与验证的发件人身份不匹配.";

升级到4.2时,获取默认文件存储/存储是互斥的

try 获取静态文件路径时 Django 给出错误

在不指定查找的情况下调用 prefetch_lated() 有用吗?

在 django HTML 邮箱模板中使用字体

如何解决 AssertionError: .accepted_renderer not set on Response in django and ajax

django 管理员登录突然要求 csrf 令牌

验证 Django 模型对象的正确方法?

断开模型的信号并在 django 中重新连接

如何在终端中切换 Python 版本?

Django: Admin:在管理员中更改字段的小部件

在 Django 管理员中嵌套内联?

Django populate() 不可重入

无效的命令 WSGIDaemonProcess 在 CentOS 6.7 上部署 Django 应用程序

Django 1.7 - 如何 suppress (1_6.W001)某些元素单元测试可能无法按预期执行.?

ProgrammingError: 安装 Psycopg2 后,关系django_session不存在错误

只使用 Django 的某些部分?

关闭 Django Rest Framework ModelViewSet 的自动分页

防止 django 管理员转义 html