我可以在应用 ManyToManyField 突变之前检测它们吗?
Can I detect ManyToManyField mutations before they are applied?
我有一个 Django 应用程序,它可以将某些模型的更改广播给它的客户端,让它们保持最新状态。
我有一个单独的应用程序,它绑定到这些模型的 post_save
信号并触发广播。
ManyToManyFields
的模型出现了问题。我不太熟悉 Django 对此的处理,但我知道这些字段实际上是在模型保存后更新的。
我能够使用 m2m_changed
信号对 post_*
操作做出反应,并在对象全部更新后发送广播。但是,在 post_save
处理程序中,我仍然需要检测 m2m 字段是否会发生变异,以避免广播不完整的数据。我如何在 post_save
信号处理程序或模型的 save
方法中检测到这一点?当 m2m 字段即将发生变异时,有没有办法在对象上升起标志?
这是我试过的方法:
- 处理
m2m_changed
信号的 pre_*
动作以检测字段的传入突变,但这不起作用,因为信号在 post_save
之后触发,为时已晚(数据已经播出)
- 创建模型实例时存储初始值,并在覆盖的
save
方法中比较它们以查找更改。这不起作用,因为字段没有更改并且报告为 == 初始值;另外我在其他问题上读到这种做法可能会导致竞争条件。
非常感谢您的帮助。
我终于解决了这个问题。供参考:
TL;DR: 模型层不是执行此操作的正确位置;视图层是。
我在视图层重新实现了通知系统,而不是在模型层。我制作了一个 mixin,将通知功能添加到我的视图中。
感谢这个解决方案:
- 我摆脱了信号
- 我可以更好地控制正在发生的事情,这大大简化了通知处理程序代码。
我有一个 Django 应用程序,它可以将某些模型的更改广播给它的客户端,让它们保持最新状态。
我有一个单独的应用程序,它绑定到这些模型的 post_save
信号并触发广播。
ManyToManyFields
的模型出现了问题。我不太熟悉 Django 对此的处理,但我知道这些字段实际上是在模型保存后更新的。
我能够使用 m2m_changed
信号对 post_*
操作做出反应,并在对象全部更新后发送广播。但是,在 post_save
处理程序中,我仍然需要检测 m2m 字段是否会发生变异,以避免广播不完整的数据。我如何在 post_save
信号处理程序或模型的 save
方法中检测到这一点?当 m2m 字段即将发生变异时,有没有办法在对象上升起标志?
这是我试过的方法:
- 处理
m2m_changed
信号的pre_*
动作以检测字段的传入突变,但这不起作用,因为信号在post_save
之后触发,为时已晚(数据已经播出) - 创建模型实例时存储初始值,并在覆盖的
save
方法中比较它们以查找更改。这不起作用,因为字段没有更改并且报告为 == 初始值;另外我在其他问题上读到这种做法可能会导致竞争条件。
非常感谢您的帮助。
我终于解决了这个问题。供参考:
TL;DR: 模型层不是执行此操作的正确位置;视图层是。
我在视图层重新实现了通知系统,而不是在模型层。我制作了一个 mixin,将通知功能添加到我的视图中。 感谢这个解决方案:
- 我摆脱了信号
- 我可以更好地控制正在发生的事情,这大大简化了通知处理程序代码。