Django post_syncdb信号处理程序没有被调用?

时间:2010-12-08 19:19:04

标签: python django signals django-syncdb

我有myapp/management/__init__.py注册post_syncdb处理程序,如下所示:

from django.db.models import signals
from features import models as features

def create_features(app, created_models, verbosity, **kwargs):
    print "Creating features!"
    # Do stuff...

signals.post_syncdb.connect(create_features, sender=features)

我已经验证了以下内容:

  1. featuresmyapp都在settings.INSTALLED_APPS
  2. myapp.management在syncdb运行之前加载(通过模块级别的print语句验证)
  3. features应用已由syncdb处理,并发出post_syncdb信号(通过syncdb检查--verbosity=2的输出进行验证。
  4. 我正在为另一对应用程序使用完全相同的习惯用法,并正确调用该处理程序。我比较了这两个模块,发现调用之间没有相关的差异。
  5. 但是,永远不会调用myapp.management.create_features。我错过了什么?

3 个答案:

答案 0 :(得分:3)

尝试将其放入models.py

答案 1 :(得分:1)

刚刚遇到同样的问题,我解决它的方法是从函数参数中删除sender并在回调函数中检查它。

from django.db.models import signals
from features import models as features

def create_features(app, created_models, verbosity, **kwargs):
    print "Creating features!"
    if app != features #this will work as it compares models module instances
        return
    # Do stuff...

signals.post_syncdb.connect(create_features)

这样你可以像Django docs建议的那样将它们保存在你的管理模块中。我同意它应该像你建议的那样工作。你可以在django.dispatch中深入研究Signal类的实现。

答案 2 :(得分:0)

重点在于sender。只有在sender解决后才会调用您的自定义回调。在我的情况下,senderdb.models并且如果syncdb第一次调用,i.o,则无法解决问题。同步模型存在于数据库中。在编写的文件中,但没有适当强调。

  

<强>发送方

     

刚刚安装的模型模块。也就是说,如果syncdb刚刚安装了名为“foo.bar.myapp”的应用程序,则发件人将是foo.bar.myapp.models模块。

所以我的解决方案是删除数据库并再次安装我的应用程序。

相关问题