我的 Django 应用程序中有一个
Post
模型。它通过名为 User
的 UserTag
模型与 user_tags
模型具有多对多关系。
class Post(models.Model):
id = models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
text = models.TextField()
user_tags = models.ManyToManyField(User, through=UserTag)
class UserTag(models.Model):
id = models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)
post = models.ForeignKey(Post, on_delete=models.CASCADE, null=True, blank=True)
comment = models.ForeignKey(Comment, on_delete=models.CASCADE, null=True, blank=True)
def save(self, *args, **kwargs):
print("#### user tagged ##### - save method")
print(self.user)
return super().save(*args, **kwargs)
@receiver(post_save, sender=UserTag)
def user_tagged_signal(sender, instance, created, **kwargs):
if not created:
return
print("#### user tagged ##### - post save signal")
print(instance.user)
当我将用户标记到帖子时,如下所示:
post.user_tags.set(users)
或
post.user_tags.add(user)
创建了 UserTang
模型实例,但未调用 save
模型的 post_save
方法或 UserTag
信号。
我想根据
UserTag
实例的创建和删除向用户发送通知并删除通知。
我做错了什么或者你能给我建议一个解决方案吗?
RelatedManager.add
不调用直通模型的save方法。 set
也没有(它在底层使用 add
)。相反,这些方法使用 QuerySet.bulk_create
直接插入到表中。
但是,使用具有多对多关系的 add() 不会调用任何 save() 方法(bulk 参数不存在),而是使用 QuerySet.bulk_create() 创建关系。 如果您需要在创建关系时执行一些自定义逻辑,请监听 m2m_changed 信号,该信号将触发 pre_add 和 post_add 操作。