【问题标题】:Change field from date to datetime将字段从日期更改为日期时间
【发布时间】:2016-12-21 13:53:50
【问题描述】:

我需要将模型字段从 DateField 更改为 DateTimeField./manage.py makemigrations 生成的迁移仅将列类型从日期更改为日期时间,但不会迁移现有数据。

例如当我更改以下模型时

class Post(models.Model):
    time = models.DateField()

class Post(models.Model):
    time = models.DateTimeField()

时间列的值仍然是数据库中的日期(如2016-12-21)。因此,每个帖子的post.time 将是None

相反,像datetime.date(2016, 12, 21) 这样的每个对象都应该自动变为datetime.datetime(2016, 12, 21, 0, 0)。解决这个问题的最佳方法是什么?

【问题讨论】:

    标签: python django date datetime migration


    【解决方案1】:

    您可以使用记录在 here 的数据迁移

    您的迁移可能是:

    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    from datetime import datetime
    
    from django.db import migrations, models
    
    def update_time(apps, schema_editor):
        Post = apps.get_model("yourappname", "Post")
        for post in Post.objects.all():
            post.time = datetime.combine(post.time, datetime.min.time())
            post.save()
    
    class Migration(migrations.Migration):
        initial = True
    
        dependencies = [
            ('yourappname', '0001_initial'),
        ]
    
        operations = [
            migrations.RunPython(update_time),
        ]
    

    【讨论】:

      【解决方案2】:
      1. 创建一个作为 DateTimeField 的新列。运行./manage.py makemigrations
      2. 运行./manage.py migrate
      3. 创建手动迁移脚本以从 DateField 中提取日期并更新行的 DateTimeField。
      4. 删除日期字段。运行./manage.py makemigrations
      5. 运行./manage.py migrate,这将运行#3 迁移文件,然后运行#4 以删除DateField。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-26
        • 1970-01-01
        • 2014-12-11
        • 1970-01-01
        • 2019-02-05
        相关资源
        最近更新 更多