Можно ли обнаружить мутации ManyToManyField до их применения?

У меня есть приложение Django, которое транслирует изменения некоторых своих моделей своим клиентам, чтобы поддерживать их в актуальном состоянии. Для этого у меня есть отдельное приложение, которое привязывается к сигналу post_save этих моделей и запускает трансляцию.

Проблемы возникли с моделями с ManyToManyFields. Я не очень хорошо знаком с тем, как Django обрабатывает это, но я понимаю, что эти поля на самом деле обновляются после сохранения модели.

Я смог использовать сигнал m2m_changed для реакции на действия post_* и отправить трансляцию после того, как объект будет обновлен. Однако в обработчике post_save мне все еще нужно определить, что поле m2m будет изменено, чтобы избежать передачи неполных данных. Как я могу обнаружить это либо в обработчике сигнала post_save, либо в методе модели save? Есть ли способ поднять флаг на объекте, когда m2m-поле собирается быть измененным?

Вот что я пробовал :

  • Обрабатываем действия pre_* сигнала m2m_changed для обнаружения входящей мутации поля, но это не работает, так как сигнал срабатывает после post_save, что слишком поздно (данные уже были переданы).
  • Сохранять начальные значения при создании экземпляра модели и сравнивать их в переопределенном методе save для поиска изменений. Это не работает, потому что поля не изменяются и сообщают, что они == начальному значению; к тому же я читал в других вопросах, что такая практика может вызвать условия гонки.

Большое спасибо за помощь.

Я наконец-то разобрался с этим. Для справки:

TL;DR:Слой модели не является подходящим местом для этого; слой представления является таковым.

Я повторно реализовал систему уведомлений на уровне представления вместо того, чтобы делать это на уровне модели. Я сделал миксин, который добавляет функции уведомлений в мои представления. Благодаря этому решению :

  • Я избавился от сигналов
  • Я получил гораздо лучший контроль над происходящим, что значительно упростило код обработчика уведомлений
  • .
Вернуться на верх