从日期到日期时间更改字段

时间:2016-12-21 13:53:50

标签: python django date datetime migration

我需要将模型字段从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)。什么是解决这个问题的最佳方法?

2 个答案:

答案 0 :(得分:2)

您可以使用记录在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),
    ]

答案 1 :(得分:1)

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