我在模型中有一个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。
答案 0 :(得分:0)
我没有测试过,但可能你应该做这样的帖子解释: South migrate DateField to IntegerField或Django 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负责在数据库级别表示日期时间。