Всем привет друзья! В общем столкнулся я похоже с багом фреймворка или как минимум непонятным его поведением.
В общем, имею я модель, одно поле которой является m2m. Для некоторых целей я указал through модель в ManyToManyField. Классы связанных моделей выглядят примерно так:
class Topping(models.Model):
# ...
pass
class Pizza(models.Model):
# ...
toppings = models.ManyToManyField(Topping, through=ToppingPizza)
На все это навешен сигнал m2m_changed
, все как в доке и выглядит примерно так:
def toppings_changed(sender, **kwargs):
# Do something
pass
m2m_changed.connect(toppings_changed, sender=Pizza.toppings.through)
Далее я настраиваю админку с помощью инлайновых полей,чтобы в одной форме и объект Pizza добавить, и связанные с ним toppings присоединить. Как то так, ну в общем все стандартно и банально:
class ToppingInline(StackedInline):
model = Pizza.toppings.through
class PizzaAdmin(ModelAdmin):
inlines = (ToppingInline, )
site.register(Pizza, PizzaAdmin)
И магия вся заключается в том, что обработчик toppings_changed
никак не ловит сигнал. Но еще большая странность заключается в том, что если я делаю через сигналы post_save
или post_delete
, настроенные точно таким же образом на один и тот же обработчик, то все работает. И происходит это только при инлайновом добавлении в админке. Если юзать напрямую add
или remove
, то вроде как работает. В общем странность.... Сигнал должен испускаться и обрабатываться как это описано в доке, а по факту не работает.
Такой вариант настройки коннекта тоже не работает
m2m_changed.connect(toppings_changed, sender=ToppingPizza)
В общем что это, с чем связано, не знаю... Быть может кому то станет интересно и поможет дельным советом.