【问题标题】:How to reference signals outside of models.py如何引用models.py之外的信号
【发布时间】:2012-12-13 07:57:38
【问题描述】:

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)

【问题讨论】:

  • from signals import * 在您的models.py 中不起作用?
  • @favoretti 我现在就试试。
  • 如果您在 models.py 中导入信号,在 signal.py 中导入模型,您可能需要使用特定的导入语句来避免循环导入:import signalsimport models,而不是使用* 或该模块的成员。
  • 虽然可能不是,考虑到它不仅仅是fundefs,还有funcalls。
  • 那么也许你可以将fundefs留在signals.py中并参考它们(实际的post_save.connect(...)仍然在models.py中调用。

标签: python django


【解决方案1】:

如何在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 

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

【讨论】:

  • 你能提供一个最小的例子吗?
【解决方案2】:

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

这将确保尽早注册并避免循环导入。

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2020-04-13
    • 2012-06-11
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多