0

我正在研究一些信号监听器,它们从模型创建记录。在 django 文档中,据说侦听器应该在 models.py 中注册。因为监听器的行数很大,我想把它们的逻辑从models.py文件中分离出来。就我而言,似乎它已经导致循环导入问题。在保持代码分离的同时避免这个问题的最佳方法是什么?

目前是这样的:models.py

class foo(models.Model):
    #model definition

import listeners

听众.py

import models
def fun(sender,**kwargs):
    bar=models.foo()
    #listener logics....

from AnotherApp.models import AnotherModel
post_save.connect(fun,sender=AnotherModel)
4

1 回答 1

1

这是一个有趣的 hack:

from django.db.models import get_model

import models

def fun(sender,**kwargs):
    # still better than doing the import in the function isn't it ...
    if sender != get_model('anotherapp', 'anothermodel'):
        return

    bar=models.foo()
    #listener logics....

post_save.connect(fun)

这甚至可能有效,但我不能说:

post_save.connect(fun, sender=get_model('anotherapp', 'anothermodel'))

顺便说一句,有比listeners更好的名字:reciever是 Django 的名字,而slot是 common name

无论如何,我无法提供更多帮助,因为我无法使用您粘贴的代码重现您的问题。请确保您粘贴的代码能够重现您的问题。

于 2012-02-28T16:54:25.887 回答