Django Migrate - 将charfield更改为datetimefield

时间:2014-10-16 05:37:44

标签: django django-models migration

我在模型中有一个charfield,我想更改为Datetimefield。

days = models.CharField(max_length=100)

days = models.DateTimeField(blank=True, null=True)

但是当我使用migrate命令时,它会给我这个错误。

  

django.db.utils.ProgrammingError:column" days"无法施展   输入带时区的时间戳

我正在使用Django 1.7。

2 个答案:

答案 0 :(得分:0)

我没有测试过,但可能你应该做这样的帖子解释: South migrate DateField to IntegerFieldDjango south: changing field type in data migration

答案 1 :(得分:0)

Django的时区处理方法是将所有datetimes转换为UTC,然后将它们存储在数据库中,而不包含任何时区信息。显然,您的CharFields包含时区字段。

一种方法是编辑makemigrations生成的迁移文件,并插入RunPython命令作为第一个操作。使用它将CharFields转换为没有时区的字符串UTC版本。这可能看起来像这样:

from django.utils.dateparse import parse_datetime
from django.utils import timezone

days_aware = parse_datetime(days)
days_utc = days_aware.astimezone(timezone.utc)
days_naive = days_utc.replace(tzinfo=None)
days = str(days_naive)

或者,您可以改为创建DateTimeField作为新字段(例如days_dt),而不是更改字符串表示。进行RunPython数据迁移,将字符串转换为日期时间(days_dt = parse_datetime(days));删除days字段;并将days_dt重命名为days。这也可行,并让Django负责在数据库级别表示日期时间。