5

在 的文档中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)
4

2 回答 2

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

于 2012-12-30T22:27:14.517 回答
1

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

这将确保尽早注册并避免循环进口。

于 2013-01-11T17:56:02.320 回答