在 Django 中更新多对多关系时如何不触发“m2m_changed”信号?

Posted

技术标签:

【中文标题】在 Django 中更新多对多关系时如何不触发“m2m_changed”信号?【英文标题】:How to not trigger `m2m_changed` signal when updating many to many relationship in Django? 【发布时间】:2021-11-03 07:38:00 【问题描述】:

用例

在我的例子中,我有两个信号在两个 2 m2m 场上监听,每个场都在不同的模型中。当一个信号被触发时,问题就会发生,它会触发另一个信号,反之亦然,这将导致一个永远不会结束的递归循环。我需要一种方便的方法来运行一个信号而不触发第二个信号。

了解更多

如果您想知道这种情况是如何发生的:我有两个模型需要让它们相互同步;如果我更新了一个模型中的 m2m 字段,我需要将这些更改反映在另一个模型中的另一个 m2m 字段上,反之亦然。

【问题讨论】:

【参考方案1】:

解决方案是使用set 代替:addremoveclear。因为所有这些都会多次触发m2m_changed 信号。

documentation 谈论set 或part 谈论m2m_changed 中没有提到这一点

【讨论】:

以上是关于在 Django 中更新多对多关系时如何不触发“m2m_changed”信号?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决具有多对多关系的石墨烯 django 节点字段

Django 从多对多关系中删除对象

如何更新多对多关系中的现有对象(.Net 5)

django数据库多对多修改对应关系

如何在双连接关系之后在 Django 中执行查询(或:如何绕过 Django 对多对多“通过”模型的限制?)

如何在 Django 中向多对多关系中添加字段?