Изменение DateField на DateTimeField в Django

В моем текущем файле моделей для моего приложения у меня есть несколько полей даты публикации, даты начала и окончания. Однако я хотел бы изменить их с DateFields на DateTimeFields. Это даст пользователю немного больше гибкости при установке даты публикации, так как он хотел бы указать время.

Я использую юг для миграции базы данных, будут ли у меня проблемы при изменении поля в базе данных? Или надо будет удалить? Затем добавьте его как DateTimeField?

Как только я это сделаю, смогу ли я установить время по умолчанию? например, я бы хотел, чтобы дата начала начиналась в 9 утра. и дата окончания, чтобы закончить в полночь.

Во всяком случае, вот модели, которые я хотел бы изменить.

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

Я хотел бы изменить на:

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

Любая помощь будет оценена по достоинству.


person JDavies    schedule 26.09.2013    source источник


Ответы (2)


Оказывается, когда вы меняете 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

Хотя я бы посоветовал сделать резервную копию базы данных, прежде чем вносить какие-либо изменения.

person JDavies    schedule 26.09.2013

Вы можете легко сделать это с югом:

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), что менее читабельно.

person augustomen    schedule 26.09.2013