2010-12-08 91 views
3

我有一个myapp/management/__init__.py被注册post_syncdb处理,像这样:Django 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永远不会被调用。我错过了什么?

+0

这个问题是从2010年。请参阅这里的解决方案在2016年有效:http://stackoverflow.com/a/32446857/633961 – guettli 2016-10-19 09:57:31

回答

3

尝试把它在你的models.py

+2

这将技术上的工作,我想,所以我会接受它作为一个答案,但根据文档,这确实属于管理层次结构中的某个位置:http://docs.djangoproject.com/en/dev/ref/signals/#post-syncdb – 2011-01-15 16:41:10

0

点是在sender。只有在sender计算出来后,才会调用您的自定义回调。在我的情况下,senderdb.models,如果syncdb不是第一次调用i.o.同步模型存在于数据库中。在它写的文件中,但没有提出适当的重点。

发件人

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

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

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文档提示的那样。我同意它应该像你所建议的那样工作。您可以深入探究django.dispatch中Signal类的实现。