通过创建 ManyToManyField 的模型实例时,未调用 save 方法或 post_save 信号

问题描述 投票:0回答:1

我的 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
实例的创建和删除向用户发送通知并删除通知。

我做错了什么或者你能给我建议一个解决方案吗?

python django django-signals
1个回答
0
投票

RelatedManager.add
不调用直通模型的save方法。
set
也没有(它在底层使用
add
)。相反,这些方法使用
QuerySet.bulk_create
直接插入到表中。

但是,使用具有多对多关系的 add() 不会调用任何 save() 方法(bulk 参数不存在),而是使用 QuerySet.bulk_create() 创建关系。 如果您需要在创建关系时执行一些自定义逻辑,请监听 m2m_changed 信号,该信号将触发 pre_add 和 post_add 操作

https://docs.djangoproject.com/en/5.0/ref/models/relations/#django.db.models.fields.lated.RelatedManager.add

© www.soinside.com 2019 - 2024. All rights reserved.