模型中具有多对多字段:
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)
这样,就确保了数据处理顺序的正确性。
网友评论