django:在models.py和循环导入问题中注册监听器

时间:2012-02-28 14:42:08

标签: python django django-signals cyclic-reference

我正在研究一些信号监听器,它会从模型中创建记录。在django docs中,据说听众应该在models.py中注册。因为听众的行很大,我想将他们的逻辑与models.py文件分开。在我的情况下,它似乎已经导致循环导入问题。在保持代码分离的同时避免此问题的最佳方法是什么?

目前它是这样的: models.py

class foo(models.Model):
    #model definition

import listeners

listeners.py

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

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

1 个答案:

答案 0 :(得分:1)

这是一个有趣的黑客:

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'))
顺便说一下,有比听众更好的名字reciever is the Django-ish nameslot is the common name

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