【问题标题】:Python deepcopy in a post_save signal?post_save 信号中的 Python deepcopy?
【发布时间】:2012-02-02 08:40:19
【问题描述】:

以下代码在 Django 信号中,当副本数为“2”时,以下代码会创建 80+ 个副本,然后崩溃……怎么了?

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 中的最佳方法是什么?

【问题讨论】:

    标签: python django deep-copy django-signals


    【解决方案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
    

    【讨论】:

    • 感谢您的回答。问题是这个“deepcopy”被​​放置在 post_save 信号中,并且每次保存克隆对象都会导致递归。所以我只是在克隆前“断开”信号,在操作后“连接”信号,一切正常。
    猜你喜欢
    • 1970-01-01
    • 2014-05-23
    • 2013-06-13
    • 2017-04-06
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多