2014-11-21 53 views
0

模型的Django pre_delete模型的方法:执行意外

我有三个型号:

包,商品和交易。

包型号:

class Packet(models.Model): 
    """ 
    Packet model 
    """ 
    #Some Fields  

产品型号:

class Item(models.Model): 
    """ 
    Item model class 
    """ 
    packet = models.ForeignKey(Packet, 
           verbose_name='related packet', 
           ) 
    #Some Fields 

@receiver(pre_delete) 
def copy_item_details(sender, instance, **kwargs): 
    """ 
    :param sender: 
    :param instance: 
    :param kwargs: 
    :return: 
    """ 
    #Some code   

交易模式:

class Transaction(models.Model): 
    """ 
    Transaction Model 
    """ 
    packet = models.ForeignKey(Packet, 
           verbose_name='related packet', 
           ) 
    #Some Fields 

我的问题是,如果我尝试删除事务类的实例。 Item模型类中定义的方法(copy_item_details)正在执行。为什么这样? copy_item_details只应在Item模型类的实例被删除时执行。

回答

1

@receiver定义指定信号的发送方:

@receiver(pre_delete, sender=Item) 
def copy_item_details(sender, instance, **kwargs): 
    """ 
    :param sender: 
    :param instance: 
    :param kwargs: 
    :return: 
    """ 
    #Some code 

注: 信号应放置在signals.py不是在模型。 根据Django文档:

“严格地说,信号处理和注册码可以住 任何你喜欢的,但建议避免 应用程序的根模块和模型模块,以尽量减少进口的 副作用代码

实际上,信号处理程序通常是在它们相关的应用程序的信号子模块中定义的。

这是您的link

+0

sender = Transaction or sender = Item ???? – 2014-11-21 10:42:13

+0

因为我想为Item模型执行此方法。你能告诉我为什么会发生这种情况.... – 2014-11-21 10:42:51

+0

@ user2217267检查更新到我的答案。 – wolendranh 2014-11-21 10:46:45