При создании экземпляра модели ManyToManyField не вызывается метод save или сигнал post_save

У меня есть модель Post в моем приложении Django. Она имеет отношения "многие-ко-многим" с моделью 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 не вызывает метод сохранения сквозной модели. Также как и 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.related.RelatedManager.add

Вернуться на верх