Сигналы Django как уведомить пользователя о новом ответе?
Прямо сейчас мой автор получает уведомления через сигналы, если кто-то ответил или прокомментировал. Давайте немного объясним вам эту строку кода
if instance.user.id != instance.blog.author.id: срабатывает только если пользователь не является автором блога. вот мой код:
models.py
class BlogComment(models.Model):
blog = models.ForeignKey(Blog,on_delete=models.CASCADE,blank=True,null=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,blank=True,null=True)
@receiver(post_save,sender=BlogComment)
def NotiFicationSignals(instance,created,**kwargs):
if created:
if instance.user.id != instance.blog.author.id: #notifiy author
noti_to_author = Notifications.objects.create(duplicate_value="author",sender=instance.user,receiver=instance.blog.author,text_preview=f"Recived new comment from {instance.user}")
Теперь я хочу создать объект уведомления для комментатора, если на его комментарий добавлен какой-либо ответ.
добавьте необязательное поле reply_to foreign_key к вашему комментарию в блоге, например:
reply_to= models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="replies_to_me", blank=True,null=True)
тогда сделайте это в ваших сигналах
noti_to_commenter = Notifications.objects.create(duplicate_value="author",sender=instance.user,receiver=instance.reply_to,text_preview=f"Recived new comment from {instance.user}")
Как-то нужно отслеживать родительский комментарий (начальный комментарий, на который можно ответить). Я могу предложить один способ, основанный на приведенной вами схеме модели:
Вы можете добавить поле parent_comment в модель BlogComment. Это поле может быть пустым для родительского комментария, но вы должны установить это поле для дочерних или ответных комментариев. Это поле будет указывать на родительскую модель BlogComment, и вы сможете извлекать информацию о пользователе из этого поля.
В этом сценарии ваш код будет выглядеть следующим образом:
class BlogComment(models.Model):
blog = models.ForeignKey(Blog,on_delete=models.CASCADE,blank=True,null=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,blank=True,null=True)
parent_comment = models.ForeignKey('self', on_delete=models.CASCADE,blank=True,null=True)
@receiver(post_save,sender=BlogComment)
def NotiFicationSignals(instance,created,**kwargs):
if created:
if instance.user.id != instance.blog.author.id: #notify author
noti_to_author = Notifications.objects.create(duplicate_value="author",sender=instance.user,receiver=instance.blog.author,text_preview=f"Recived new comment from {instance.user}")
if instance.parent_comment: # notify to parent commenter
noti_to_parent_commenter = Notifications.objects.create(duplicate_value="parent commenter",sender=instance.user,receiver=instance.parent_comment.user,text_preview=f"Recived new comment from {instance.user}")
Подобная структура базы данных предложена в этой теме Схема базы данных сообщений, комментариев, ответов и лайков