2012-02-02 9 views
1

Следующий код находится в сигнале Django, а когда количество копий - «2», следующий код создает 80+ копий, а затем сработает ... Что случилось?Python deepcopy в сигнале 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) 

Thanks.

Редактировать: Duh! Найденный вопрос, вышеупомянутый код был частью post_save операции с сигналом Django, поэтому каждое «сохранение» запускает другой цикл, а затем сбой кучи.

Каков наилучший способ создания объектов 'n' и программно сохранить его в Django?

ответ

1

Это мой тестовый код, он работал как ожидалось. Я думаю, вы должны сделать единичный тест, чтобы найти, где проблема. Оставьте Django в покое!

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

Спасибо за ответ. Проблема заключалась в том, что этот «deepcopy» был помещен в сигнал post_save, и каждое сохранение объекта clone привело к рекурсии. Поэтому я просто «отключился» от сигнала перед клонированием и «подключил сигнал после операции, и все работает нормально. – lud0h