我有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)
我已经验证了以下内容:
features
和myapp
都在settings.INSTALLED_APPS
myapp.management
在syncdb运行之前加载(通过模块级别的print语句验证)features
应用已由syncdb
处理,并发出post_syncdb
信号(通过syncdb
检查--verbosity=2
的输出进行验证。 但是,永远不会调用myapp.management.create_features
。我错过了什么?
答案 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
解决后才会调用您的自定义回调。在我的情况下,sender
是db.models
并且如果syncdb第一次调用,i.o,则无法解决问题。同步模型存在于数据库中。在编写的文件中,但没有适当强调。
<强>发送方强>
刚刚安装的模型模块。也就是说,如果syncdb刚刚安装了名为“foo.bar.myapp”的应用程序,则发件人将是foo.bar.myapp.models模块。
所以我的解决方案是删除数据库并再次安装我的应用程序。