Django 的 m2m_changed

模型中具有多对多字段:

class Advice(models.Model):
    departments = models.ManyToManyField('basic.Department')

打算在模型建立时,向这个字段对应的用户发送消息,一开始的思路可能是这样做:

class Advice(models.Model):
    departments = models.ManyToManyField('basic.Department')

    def send_message(self):
        send_to_departments(self.departments.all())

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        # 这样处理无效
        self.send_message()

直接利用自定义save方法,这样是无效的。因为在save这个模型的时候,多对多的表还没有建立完成。

这个时候,应该引入 m2m_changed 信号机制

from django.db.models.signals import m2m_changed

def departments_changed(sender, instance, action, **kwargs):
    if action == 'post_add':
        instance.send_message()

m2m_changed.connect(departments_changed, sender=Advice.departments.through)

这样,就确保了数据处理顺序的正确性。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容