Django pre_delete模型方法意外执行

时间:2014-11-21 10:36:45

标签: django django-models

模特:

我有三种模式:

数据包,项目和交易。

包模型:

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

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

1 个答案:

答案 0 :(得分: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