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