3

我有一个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. 两者featuresmyappsettings.INSTALLED_APPS
  2. myapp.management在syncdb运行之前被加载(通过模块级别的打印语句验证)
  3. features应用程序正在被 处理syncdb,并且它正在发出一个post_syncdb信号(通过syncdb使用--verbosity=2.
  4. 我对另一对应用程序使用完全相同的习语,并且正确调用了该处理程序。我比较了这两个模块,发现调用之间没有相关差异。

但是,myapp.management.create_features从不调用。我错过了什么?

4

3 回答 3

3

试着把它放在你的models.py

于 2010-12-09T00:49:18.097 回答
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 文档建议的那样将它们保存在您的管理模块中。我同意它应该像你建议的那样工作。您可能会深入研究 Signal 类的实现django.dispatch

于 2011-11-10T11:24:13.217 回答
0

重点在sender. 只有在解决后才会调用您的自定义回调sender。在我的情况下senderdb.models如果 syncdb 不是第一次调用,那么它就无法解决,io 同步模型存在于数据库中。在文件中是这样写的,但没有适当强调。

发件人

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

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

于 2011-10-20T14:53:01.487 回答