Сигнал m2m_changed не срабатывает, когда экземпляр в отношениях m2m удаляется? Как я могу инициировать обновления в других моделях, когда это происходит
У меня есть приложение, которое имеет фронтенд "данных в реальном времени", используя сигналы django и webhooks. Это работает, когда отношения удаляются или добавляются, но если экземпляр отношения удаляется, m2m_changed не срабатывает, поэтому фронтенд не обновляется. Должен ли m2m_changed срабатывать в такой ситуации?
В родительской модели есть m2m поле, которое хранит "подписанные на" дочерние модели. У меня также есть функция свойства, которая показывает все возможные дочерние модели, на которые можно подписаться (у меня есть как подписанные, так и неподписанные поля, так что я могу иметь переключатель включения/выключения на фронтенде):
class Parent(models.model):
subscribed_to = m2mField(Child)
@property
def potential_subscriptions(self):
return Child.objects.all() # not sure if this is bad practice
Мой сигнал выглядит следующим образом:
@receiver(m2m_changed, sender=Parent.subscribed_to.through)
def signal(sender, instance, action, reverse, **kwargs):
from .api.serializers import ParentSerializer
if action == "post_add" or action == "post_remove" or action == "post_clear":
serializer = ParentSerializer(instance)
websocket.send(f"parent_{instance.id}", "parent_update", serializer.data)
Итак, это работает, когда дочерние экземпляры добавляются или удаляются, но если дочерний экземпляр удаляется, это не происходит, поэтому мой вебсокет не обновляет фронтенд.
В качестве обходного пути я попытался создать сигнал pre_delete для объекта Child, и в этом сигнале я очищаю его отношения перед удалением, чтобы заставить сработать сигнал Parent m2m. Этот способ сообщает фронтенду, что ребенок был отписан, но ребенок все еще находится в поле данных potential_subscriptions, поскольку все это срабатывает в сигнале Childs pre_delete. Фронтенд обновляется перед удалением ребенка, поэтому фронтенд все еще считает, что ребенок существует, хотя это не так.
Есть ли способ перелогизировать мои сигналы, чтобы получить желаемый результат? Или, возможно, мне придется перестроить мою модель?