При создании экземпляра модели 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.