Django检测ManyToManyField中的更改

时间:2014-05-19 23:53:36

标签: python django

我有一个与User模型具有ManyToMany关系的模型:

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

我想在将用户添加到此ManyToMany字段时向用户发送电子邮件。我们可以随时添加它们,这通常不止一次(即一次添加几个用户)。

我一直在调查最佳方法,我认为它会使用m2m_changed信号。似乎Django(或者至少通过管理面板)首先清除所有关系,然后再将它们重新插入。看看发出的信号,我看到' pre_clear',' post_clear',' pre_add'和' post_add'。

问题在于' pk_set' in' pre_add'和' post_add'是相同的,并且' pre_clear' &安培; ' post_clear'没有任何' pk_set'属性。因此,即使我可以在' pre_clear'中找出如何收集pks的方法。 (我不知道该怎么做),然后我必须保存它们以便在“post_save”中进行比较。阶段(计算出添加了哪些用户。

这样做有好办法吗?使用信号或其他东西。

1 个答案:

答案 0 :(得分:0)

使用m2m_changed信号,你在正确的轨道上。

您需要做的就是等待每个m2m被添加,作为发送者通过表格传递:

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

然后在你的方法中:

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

HTH!

此致