2017-07-27 1 views
1

Ich habe folgendes Szenario löschen:Django - Wie Attribut auf ein anderes Modell zu bewegen, und es

class C(): 
    y = models.Integer... 
    z = models.Integer... 

class D(): 
    y2 = models.Integer... 
    z2 = models.Integer... 

Ich möchte die Daten aus dem Attribut y kopieren und an y2 einfügen. Ok, ich habe eine Datenmigration erstellt, die die Arbeit erledigt. Auf den Punkt gebracht:

from greatapp.models import C, D 

class Migration(migrations.Migration): 

    def move_info_to_class_d(apps, schema_editor): 
     objs = C.objects.all() 

     for obj in objs.iterator(): 
      d = D.objects.create(y2=obj.y) 

    operations = [ 
     migrations.RunPython(move_info_to_class_d) 
    ] 

Beachten Sie, dass ich auch das Attribut aus der Klasse C entfernen möchten, so dass der Code würde wie folgt aussehen:

class C(): 
    z = models.Integer... 

class D(): 
    y2 = models.Integer... 
    z2 = models.Integer... 

Alles sieht ok, nicht wahr? Zeit zu begehen.

Oh, warte! Die nächste Person, die diesen Code ausführt, erhält einen Fehler, da die Datenmigration versucht, auf ein Attribut zuzugreifen, das nicht mehr existiert (in diesem Fall y).

Kennt jemand eine Problemumgehung (die keine .sql-Dateien benötigt), um das Attribut in eine andere Modellklasse zu kopieren und dann aus der Quellklasse zu löschen?

Antwort

0

Deshalb erhalten Sie das apps Argument für die Datenmigration. Es enthält Definitionen der Modelle, so wie sie beim Erstellen der Datenmigration erstellt wurden.

tun So

def move_info_to_class_d(apps, schema_editor): 
    C = apps.get_model('yourappname', 'C') 
    D = apps.get_model('yourappname', 'D') 

    objs = C.objects.all() 

    for obj in objs.iterator(): 
     d = D.objects.create(y2=obj.y) 

Und es wird gut funktionieren (so lange, wie Sie die Migration erstellen, die C.y nach diesem entfernt).

Edit: oh, und objs.iterator() ist unnötig, objs ist bereits von selbst iterable.

+0

Es hat funktioniert, danke !. ps .: Ich habe iterator() benutzt, um den internen Cache zu deaktivieren, weil mein PC nicht mehr genügend Arbeitsspeicher hatte, wenn ich die Schleife ohne ihn laufen ließ (es ist ein wirklich großer Datensatz) – almanegra

Verwandte Themen