【问题标题】:What is wrong with my signal handling?我的信号处理有什么问题?
【发布时间】:2016-01-12 10:14:35
【问题描述】:

我有这个:

class PersonneRelation(models.Model):
    #blabla
    pass


@receiver(post_save, sender=PersonneRelation)
def signal_receiver(sender, **kwargs):
    print('***'*5)
    print(sender)

这很好......直到我添加另一个这样的接收器:

@receiver(post_save, sender=PersonneTravel)
def signal_receiver(sender, **kwargs):
    created = kwargs['created']
    obj = kwargs['instance']
    print('***'*5)
    print(sender)
    print(created)

它不是同一个发送者,所以它应该区分这两个信号......但是一旦我添加了前一个信号,它似乎会覆盖第一个信号,并且不再调用第一个信号。我错过了什么?

【问题讨论】:

  • 您是否使用相同的方法名称定义了两者?..(在同一个文件中?)
  • ...这是问题所在。我可以请您回答以便我检查您的回答是否有效吗?任何像我这样有信号的新手都应该被警告“每个信号处理有一个不同的名字”......
  • Olivier Pons,我现在没有对此的引用,但 python 将所有对象存储为字典,我很确定它也包括方法,因此如果你用相同的名称重新定义它它会覆盖密钥
  • 我习惯了 C,你只能在同一个文件中定义一个同名的函数。与 C++ 相同。与 Java 相同。与 LUA 相同。与德尔福相同。与 ADA 相同。与所有“干净”的语言相同。这是一种奇怪的行为,恕我直言,不应该被允许。
  • 这就是编译语言与解释语言的乐趣:)

标签: django django-models


【解决方案1】:

你已经定义了两个同名的方法,本质上你不能在同一个 py 文件中的 python 中这样做。

我更喜欢按如下方式初始化我的信号,因为它更明确它们会做什么,但只要你给它们单独的方法名称,你就可以了

post_save.connect(do_something_with_travel, sender=PersonneTravel)
def do_something_with_travel(sender, **kwargs):
    created = kwargs['created']
    obj = kwargs['instance']
    print('***'*5)
    print(sender)
    print(created)

【讨论】:

  • 注意:任何一种语法都是完全有效的(我只是想把我的答案多加一句!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多