2017-07-27 19 views
1

je le scénario suivant:Django - Comment se déplacer attribut à un autre modèle et le supprimer

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

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

Je veux copier les données de l'y d'attribut et de le coller à y2. Ok, j'ai créé une migration de données qui fait le travail. En un mot:

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) 
    ] 

Notez que je veux aussi supprimer l'attribut de la classe C, de sorte que le code ressemblerait à ceci:

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

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

Tout semble ok, pas vrai? Temps de commettre

Oh, attendez! La prochaine personne qui exécute ce code obtiendra une erreur, car la migration de données tente d'accéder à un attribut qui n'existe plus (y dans ce cas).

Quelqu'un sait-il une solution de contournement (qui n'a pas besoin de fichiers .sql) pour copier l'attribut à une autre classe de modèle, puis le supprimer de la classe source?

Répondre

0

Voilà pourquoi vous obtenez l'argument apps à la migration des données. Il contient les définitions des modèles telles qu'elles étaient lorsque vous avez créé la migration de données.

donc faire

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) 

Et cela fonctionnera très bien (aussi longtemps que vous créez la migration qui supprime C.y après celui-ci).

Éditer: oh, et objs.iterator() est inutile, objs est déjà itérable par lui-même.

+0

Cela a fonctionné, merci !. ps .: J'ai utilisé iterator() pour désactiver le cache interne parce que mon pc manquait de mémoire à chaque fois qu'il exécutait la boucle sans lui (c'est un très gros ensemble de données) – almanegra