2016-12-21 7 views
0

Мне нужно изменить поле модели от DateField до DateTimeField. Миграции, генерируемые ./manage.py makemigrations, изменяют только тип столбца с даты на дату и время, но не переносят существующие данные.Изменить поле from date to datetime

Например, когда я меняю следующую модель

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). Каков наилучший способ решить эту проблему?

ответ

1

Вы можете использовать Миграции данных документированы 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), 
    ] 
0
  1. Создать новый столбец, который является DateTimeField. Запуск ./manage.py makemigrations
  2. Run ./manage.py migrate
  3. Создание ручной миграции сценарий, чтобы вытащить даты из DateField и обновления DateTimeField в строки.
  4. Удалить поле даты. Запуск ./manage.py makemigrations
  5. Запустите ./manage.py migrate, это приведет к миграции файла миграции № 3, а затем № 4, чтобы удалить DateField.

 Смежные вопросы

  • Нет связанных вопросов^_^