【问题标题】:Migrate from DateField to DateTimeField in Django在 Django 中从 DateField 迁移到 DateTimeField
【发布时间】:2021-01-09 10:26:16
【问题描述】:

我有一个带字段的模型

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

【问题讨论】:

  • 有什么问题?什么不工作?

标签: python django migration database-migration


【解决方案1】:

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

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

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

编辑:

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

第一

在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_date 更改为date

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 2013-10-02
    • 2018-01-04
    • 2018-03-26
    • 2018-10-27
    • 2014-04-20
    • 2016-04-27
    相关资源
    最近更新 更多