Обработчик сигнала Django post_syncdb не вызывается? - PullRequest
3 голосов
/ 08 декабря 2010

У меня есть 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 ]

3 голосов
/ 09 декабря 2010

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

1 голос
/ 10 ноября 2011

Только что столкнулся с той же проблемой, и я решил, как удалить 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.

0 голосов
/ 20 октября 2011

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

отправитель

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

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

...