Только что попытался реализовать это сам, и ваша проблема в значении аргумента sender
в этой строке:
signals.m2m_changed.connect(self.update_object, sender=model)
Я прочитал документацию для сигнала m2m_changed , и отправитель будет выглядеть как MyModel.my_field.through
, так что вам нужно это использовать. Это означает, что у вас не может быть универсального класса, как вы пытаетесь сделать, но вам нужно будет определить метод _setup_save
в каждом случае с сигналом m2m_changed
, подключенным для каждого поля ManyToMany
, которое есть в модели.
Например, если ваша модель имеет два поля ManyToManyField, называемых region и sector, вы можете сделать:
# we implement these to force the update when the ManyToMany fields change
def _setup_save(self, model):
signals.m2m_changed.connect(self.update_object,
sender=MyModel.sector.through)
signals.m2m_changed.connect(self.update_object,
sender=MyModel.region.through)
signals.post_save.connect(self.update_object, sender=model)
Вы также должны определить метод _teardown_save()
:
def _teardown_save(self, model):
signals.m2m_changed.disconnect(self.update_object,
sender=MyModel.sector.through)
signals.m2m_changed.disconnect(self.update_object,
sender=MyModel.region.through)
signals.post_save.disconnect(self.update_object, sender=model)
(Это основано на коде, который я тестировал, похоже, он работает - конечно, нет ошибок в отношении несуществующих полей).
Обновление: Просто прочитайте ваш вопрос более внимательно. Возможно ли, что ваша модель имеет динамическое добавление ManyToManyField? Вызов register()
после того, как вы определили все свои классы?