Можно ли обнаружить мутации ManyToManyField до их применения?
У меня есть приложение Django, которое транслирует изменения некоторых своих моделей своим клиентам, чтобы поддерживать их в актуальном состоянии.
Для этого у меня есть отдельное приложение, которое привязывается к сигналу post_save
этих моделей и запускает трансляцию.
Проблемы возникли с моделями с ManyToManyFields
. Я не очень хорошо знаком с тем, как Django обрабатывает это, но я понимаю, что эти поля на самом деле обновляются после сохранения модели.
Я смог использовать сигнал m2m_changed
для реакции на действия post_*
и отправить трансляцию после того, как объект будет обновлен. Однако в обработчике post_save
мне все еще нужно определить, что поле m2m будет изменено, чтобы избежать передачи неполных данных. Как я могу обнаружить это либо в обработчике сигнала post_save
, либо в методе модели save
? Есть ли способ поднять флаг на объекте, когда m2m-поле собирается быть измененным?
Вот что я пробовал :
- Обрабатываем действия
pre_*
сигналаm2m_changed
для обнаружения входящей мутации поля, но это не работает, так как сигнал срабатывает послеpost_save
, что слишком поздно (данные уже были переданы). - Сохранять начальные значения при создании экземпляра модели и сравнивать их в переопределенном методе
save
для поиска изменений. Это не работает, потому что поля не изменяются и сообщают, что они == начальному значению; к тому же я читал в других вопросах, что такая практика может вызвать условия гонки.
Большое спасибо за помощь.
Я наконец-то разобрался с этим. Для справки:
TL;DR:Слой модели не является подходящим местом для этого; слой представления является таковым.
Я повторно реализовал систему уведомлений на уровне представления вместо того, чтобы делать это на уровне модели. Я сделал миксин, который добавляет функции уведомлений в мои представления. Благодаря этому решению :
- Я избавился от сигналов
- Я получил гораздо лучший контроль над происходящим, что значительно упростило код обработчика уведомлений .