【问题标题】:Several Django signal receivers in one module一个模块中的多个 Django 信号接收器
【发布时间】:2015-08-03 03:33:07
【问题描述】:

我有用于信号接收器的单独 python 模块,它被称为 signals.py 并在我的 AppConfigready() 方法中导入。

在这个模块中,我为特定模型实现了post_savepost_delete 信号接收器,并通过装饰器注册了它们:

@receiver(post_save, sender=MyModel)
def generate_smth(sender, instance, created, **kwargs):
    ...

而且效果很好。 但是,当我以相同的方式向signals.py 添加相同信号但来自不同特定型号的接收器时:

@receiver(post_save, sender=AnotherModel)
def generate_smth(sender, instance, created, **kwargs):
    ...

我的功能停止接收信号。但是,如果我将接收器移动到单独的 python 模块 mymodel_signals.pyanothermodel_signals.py 并在 ready() 中导入这两个模块,那么它们都会再次工作。

为什么不能将接收器放在一个模块中?

【问题讨论】:

    标签: python django


    【解决方案1】:
    @receiver(post_save, sender=MyModel)
    @receiver(post_save, sender=AnotherModel)
    def generate_smth(sender, instance, created, **kwargs):
        if sender.__name__ = 'MyModel':
           # Bar
        else:
          # Foo
    

    【讨论】:

    • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    【解决方案2】:

    您希望这两个函数具有相同的行为吗?如果是,您可以这样做:

    def do_smth(sender, instance, created, **kwargs):
        ...
    
    @receiver(post_save, sender=MyModel)
    def generate_smth(sender, instance, created, **kwargs):
        do_smth(sender, instance, created, **kwargs)
    
    @receiver(post_save, sender=AnotherModel)
    def generate_another_smth(sender, instance, created, **kwargs):
        do_smth(sender, instance, created, **kwargs)
    

    【讨论】:

    • 不,我的函数做不同的事情。我的问题不是关于如何实现所描述的行为,而是关于为什么这种行为不起作用:)
    猜你喜欢
    • 2013-10-21
    • 2013-07-04
    • 2016-03-23
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多