Django检测ManyToManyField的变化

0 投票
1 回答
1533 浏览
提问于 2025-04-18 07:02

我有一个模型,它和用户模型之间有多对多的关系:

class ExtraModel(models.Model):
    ...
    extra_relation = models.ManyToManyField(User, blank=True, related_name='extra_relation')

当用户被添加到这个多对多的字段时,我想给他们发送一封邮件。我们可以随时添加用户,而且这种情况经常发生一次添加多个用户。

我一直在研究最好的方法来实现这个功能,我在考虑使用 m2m_changed 信号。看起来在 Django(或者至少在管理面板中)首先会清除所有的关系,然后再重新插入它们。查看触发的信号,我看到有 'pre_clear'、'post_clear'、'pre_add' 和 'post_add'。

问题是 'pre_add' 和 'post_add' 中的 'pk_set' 是一样的,而 'pre_clear' 和 'post_clear' 没有 'pk_set' 属性。所以即使我能搞清楚如何在 'pre_clear' 阶段收集这些主键(pk),我还得把它们保存下来,以便在 'post_save' 阶段进行比较(找出哪些用户被添加了)。

有没有好的方法来做到这一点?是使用信号还是其他什么方式?

1 个回答

0

你使用m2m_changed信号的方向是对的。

你需要做的就是等到每个多对多关系(m2m)被添加时,传递通过表作为发送者:

m2m_changed.connect(method, sender=ExtraModel.extra_relation.through)

然后在你的方法里:

method(sender, instance, **kwargs):
    extra_relations = instance.extra_relations.all()
    ...

希望这对你有帮助!

祝好,

撰写回答