2012-02-02 1 views
1

Le code suivant est dans un signal Django et lorsque le nombre de copies est '2', le code suivant crée plus de 80 copies, puis se bloque ... Qu'est-ce qui ne va pas?Python deepcopy dans un signal post_save?

def internal_signal(sender, instance, signal, created, *args, **kwargs): 
     for i in range(instance.number_of_copies): 
      item_copy = deepcopy(instance) 
      item_copy.id = item_copy.id + 1 
      item_copy.internal_barcode = "%s"%(item_copy.item_location.location_code) 
      item_copy.save() 

post_save.connect(internal_signal, sender=Inventory) 

Merci.

Édition: Duh! Trouvé le problème, le code ci-dessus faisait partie de l'opération post_save d'un signal Django, de sorte que chaque «sauvegarde» déclenche une autre boucle, puis crash de tas.

Quelle est la meilleure façon de créer des 'n' objets et de les enregistrer dans Django par programmation?

Répondre

1

Ceci est mon code de test, il a performancé comme prévu. Je pense que vous devriez faire un test unitaire pour trouver où le problème est. Laissez Django tranquille!

class T: 
    def save(this): 
     pass 
from copy import deepcopy 
from copy import copy 
instance = T() 
instance.number_of_copies = 2 
instance.id = 1 
instance.item_location=T() 
instance.item_location.location_code = 2 
for i in range(instance.number_of_copies): 
    item_copy = deepcopy(instance) 
    item_copy.id = item_copy.id + 1 
    item_copy.internal_barcode = "%s"%(item_copy.item_location.location_code) 
    item_copy.save() 
    print " id,code:",item_copy.id,item_copy.internal_barcode 
+0

Merci pour la réponse. Le problème était que 'deepcopy' était placé dans le signal post_save et chaque sauvegarde de l'objet clone résultait en une récursion. J'ai donc simplement déconnecté le signal avant de cloner et connecté le signal après l'opération et tout fonctionne correctement. – lud0h

Questions connexes