【问题标题】:Django post_syncdb signal handler not getting called?Django post_syncdb 信号处理程序没有被调用?
【发布时间】:2010-12-08 19:19:04
【问题描述】:

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

但是,myapp.management.create_features 永远不会被调用。我错过了什么?

【问题讨论】:

标签: python django signals django-syncdb


【解决方案1】:

试着把它放在你的models.py中

【讨论】:

【解决方案2】:

刚遇到同样的问题,我解决的方法是从函数参数中删除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 文档建议的那样。我同意它应该像你建议的那样工作。您可能可以深入了解 django.dispatch 中 Signal 类的实现。

【讨论】:

    【解决方案3】:

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

    发件人

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多