如何引用models.py之外的信号

时间:2012-12-28 00:06:19

标签: python django

Django的文档中,它指定models.py是查找信号(post_savepre_save等的回调函数的好地方。

  

此代码应该在哪里生效?

     

您可以将信号处理和注册码放在任何您喜欢的地方。   但是,您需要确保它所在的模块得到   早期导入,以便之前注册信号处理   需要发送任何信号。这使你的应用程序的models.py很好   放置信号处理程序的地方。

     

来源:https://docs.djangoproject.com/en/dev/topics/signals/

但是,我有大量依赖于信号的业务逻辑,并且在与我的所有模型相同的文件中查看它们变得具有挑战性。

我想将它们移动到另一个文件,但我不知道如何或在哪里可以引用它们。

因此,鉴于以下文件结构,您是否可以提供一个示例,说明如何引用包含适当信号的辅助(或三级等)文件?

# models.py located in /myapp/some_installed_app/
from django import needed.modules
... # some reference to signals.py?

class SomeModel()
    pass

# signals.py located in /myapp/some_installed_app/
from django import needed.things
...

def somefun(sender,**kwargs)
    pass

post_save.connect(somefun, sender=SomeModel)

2 个答案:

答案 0 :(得分:7)

如何在models.py中“连接”信号,同时将函数保存在signals.py?


一个例子:

# models
from myapp import signals
class MyModel(models.Model)
    pass
post_save.connect(signals.do_some_stuff_with_mymodel, sender = MyModel)

# signals
def do_some_stuff_with_mymodel(**kwargs):
    pass 

这样您就不必在models中导入signals

答案 1 :(得分:1)

另一种选择是在__init__.py文件中导入信号。

这样可以确保提前注册并避免循环导入。