在Django中将DateField更改为DateTimeField

时间:2013-09-26 11:49:22

标签: django django-south

在我的应用程序的当前模型文件中,我有一些发布日期字段,开始和结束日期。但是我想将它们从DateFields更改为DateTimeFields。这将为用户在设置发布日期时提供更多灵活性,因为他们希望指定时间。

我正在使用south进行数据库迁移,在更改数据库中的字段时会有任何问题吗?或者需要将其删除?然后将其添加为DateTimeField?

一旦我完成了,我能设置默认时间吗?例如,我希望开始日期从早上9点开始。结束日期在午夜结束。

无论如何,这里是我想要改变的模型。

start_date = models.DateField()
end_date = models.DateField()

我想改为:

start_date = models.DateTimeField()
end_date = models.DateTimeField()

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

当您将DateField更改为DateTimeField以南时,只会为您更改它,以便它不会发生冲突。

例如我跑了:

python manage.py schemamigration --auto hotel

得到了这个输出:

 ~ Changed field start_date on hotel.Event
 ~ Changed field end_date on hotel.Event
Created 0018_auto__chg_field_event_start_date__chg_field_event_end_date.py. You can now apply this migration with: ./manage.py migrate hotel

虽然我会建议在进行任何更改之前备份数据库。

答案 1 :(得分:0)

你可以轻松地用南方做到这一点:

python manage.py schemamigration --auto appname

整栏将在午夜开始(例如,2013-09-26 - > 2013-09-26 00:00:00)。要更改小时,请编辑迁移,更改列后,输入:

import datetime
from django.db.models import F

# ... Automatically created db.alter_column

if not db.dry_run:  # needed whenever making data changes
    # This will add 9 hours to *all* records
    orm['appname.ModelName'].objects.all().update(start_date=F('start_date') + datetime.timedelta(hours=9))

对于end_date,它已经在午夜开始,但如果您想将其设置为23:59:59,您还可以添加datetime.timedelta(hours=23, minutes=59, seconds=59)或仅datetime.timedelta(seconds=86399),这是不太可读的。