2016-12-21 3 views
0

Ich muss ein Modellfeld von DateField zu DateTimeField ändern. Die von ./manage.py makemigrations generierten Migrationen ändern nur den Spaltentyp von Datum zu Datum, aber sie migrieren keine vorhandenen Daten.Feld von Datum zu Datum ändern

Zum Beispiel, wenn ich ändern das folgende Modell

class Post(models.Model): 
    time = models.DateField() 

zu

class Post(models.Model): 
    time = models.DateTimeField() 

die Werte der Zeitspalte noch Daten (wie 2016-12-21) in der Datenbank sein. Als Ergebnis wird post.timeNone für jeden Beitrag sein.

Stattdessen sollte jedes Objekt wie datetime.date(2016, 12, 21) automatisch datetime.datetime(2016, 12, 21, 0, 0) werden. Was ist der beste Weg, dies zu lösen?

Antwort

1

Sie können mit Datenmigrationen dokumentiert here

Migration sein könnte:

# -*- 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. eine neue Spalte erstellen, die eine Datetimefield ist. Führen ./manage.py makemigrations
  2. Run ./manage.py migrate
  3. eine manuelle Migration Skript erstellen die Daten aus der Datefield und aktualisiert die Zeile des Datetimefield zu ziehen.
  4. Entfernen Sie das DateField. Führen Sie ./manage.py makemigrations
  5. Run ./manage.py migrate, wird dies # 3 Migrationsdatei und dann # 4, um das DateField zu entfernen.