2012-02-02 52 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) 

谢谢。

编辑:杜!发现这个问题,上面的代码是Django信号的post_save操作的一部分,所以每个'save'都会触发另一个循环,然后堆崩溃。

创建'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信号中,并且克隆对象的每次保存都会导致递归。所以我简单地在克隆前断开信号并在操作后连接信号,一切正常。 – lud0h 2012-02-02 11:11:23