Django检测ManyToManyField的变化
我有一个模型,它和用户模型之间有多对多的关系:
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()
...
希望这对你有帮助!
祝好,