在Django中从DateField迁移到DateTimeField

时间:2020-09-23 08:47:30

标签: python django migration database-migration

我有一个带有字段的模型

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。 您能帮我解释一下我该怎么做吗?

1 个答案:

答案 0 :(得分:0)

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

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

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');

我不确定此解决方案是否是最佳做法,但对我来说有用。

编辑:

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

第一

在“模型”中添加一个新字段,该字段将与更改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_date更改为date

相关问题