首页 > 解决方案 > 在 Django 中从 DateField 迁移到 DateTimeField

问题描述

我有一个带字段的模型

date = models.DateField()

现在我想将此字段迁移到 DateTimeField,所以它应该如下所示:

date = models.DateTimeField()

我知道我应该运行以下命令来进行迁移。

python manage.py makemigrations
python manage.py migrate

我尝试使用此命令python manage.py schemamigration --auto appname,但对我没有帮助

但是我想通过保存日期来迁移所有这些字段,并且只添加时间 00:00:00:000000。你能帮我解释一下我该怎么做吗?

标签: pythondjangomigrationdatabase-migration

解决方案


我为我的问题找到了解决方案,因此在下面我添加了有助于进行此迁移的步骤。

将 models.py 中的字段类型从下面DateField()DateTimeField() Run 命令更改为

python manage.py makemigrations
python manage.py migrate

并且知道您将在数据库中具有字段类型,DateTimeField()但在列中date,我们只会看到像“2020-09-23”这样的日期。因此,要将格式更改为“2020-09-23 00:00:00”,我运行我的 SQLite 数据库并在 ExecuteSQL 视图中运行以下命令。

UPDATE table_name SET date=DATETIME(date, '0 minutes');

我不确定这个解决方案是否是最佳实践,但它对我有用。

编辑:

上述解决方案有效,但要提出第二种可能性。

第一的

在Model中添加一个新的字段,修改后和预期的一样date

new_date = models.DateTimeField()

第二

之后,让我们这样做:

python manage.py makemigrations
python manage.py migrate

第三

现在,我们必须使用日期列,因此我们可以将值从 复制date到。为此new_date,我们必须创建新的迁移,如下所示:

python manage.py makemigrations app_name --empty 

此命令将创建一个新的迁移

第四

现在我们必须修改文件如下(假设我们修改User模型)

from django.db import migrations, models
from datetime import datetime

def set_my_defaults(apps, schema_editor):

        User = apps.get_model('app_name', 'user')
        for us in User.objects.all():
            old = pr.date
            old_date = datetime(old.year, old.month, old.day, 10, 1, 1, 1)

            us.new_date = old_date
            us.save()

class Migration(migrations.Migration):

    dependencies = [
        ('appname', 'previous_migration_name'),
    ]

    operations = [
        migrations.RunPython(set_my_defaults),
        migrations.RemoveField(
            model_name='user',
            name='date',
        ),
        migrations.RenameField(
            model_name='user',
            old_name='new_date',
            new_name='date',
        ),
    ]

如您所见,首先我们将值从date列复制到new_date日期时间。之后,删除date列并将名称从更改new_datedate


推荐阅读