Обработчик сигнала Django post_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. И то и другое features а также myapp находятся в settings.INSTALLED_APPS
  2. myapp.management загружается до запуска syncdb (проверяется с помощью оператора печати на уровне модуля)
  3. features приложение обрабатывается syncdbи испускает post_syncdb сигнал (проверяется путем изучения syncdbвыход с --verbosity=2,
  4. Я использую точно такую ​​же идиому для другой пары приложений, и этот обработчик вызывается правильно. Я сравнил два модуля и не нашел существенных различий между вызовами.

Тем не мение, myapp.management.create_features никогда не называется. Что мне не хватает?

3 ответа

Решение

Попробуйте положить его в вашем models.py

Просто столкнулся с той же проблемой, и я решил, что 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. Я согласен, что это должно работать так, как вы предложили. Вы могли бы, вероятно, покопаться в реализации класса Signal в django.dispatch,

Дело в sender, Ваш пользовательский обратный вызов вызывается только если sender Удалось. В моем случае sender было db.models и это не сработает, если syncdb вызывается не первый раз, то есть синхронизированные модели существуют в базе данных. В документах это написано, но не ставится должный акцент.

отправитель

Модуль моделей, который был только что установлен. То есть, если syncdb только что установил приложение с именем "foo.bar.myapp", отправителем будет модуль foo.bar.myapp.models.

Поэтому мое решение было удалить базу данных и установить мое приложение снова.

Другие вопросы по тегам