如何防止 Django 中的重复信号

How to prevent Duplicate Signals in Django

我添加了一条通知,每当用户向 post 提交“赞”按钮时,被赞 post 的所有者都会收到一条通知。

我已将每个“赞”按钮的值选项设置为“赞”或“不赞同”我已限制通知仅在单击“赞”的值是“仅赞”时发送。

所以,现在在 Like 模型中我添加了信号和条件,如果 Like.value== Like 信号激活但由于某种原因它仅在新的 post 时发送两次已创建且新用户第一次点击赞,之后如果他点赞并再次点赞则发送一次。

我的问题是:

为什么每次新用户点击“赞”按钮时信号都会重复? 如何解决?

这里是post models.py:

class Post(models.Model):
    title = models.CharField(max_length=100, unique=True)
    likes = models.ManyToManyField(User, related_name='liked', blank=True)

点赞model.py:

LIKE_CHOICES = (
    ('Like', 'Like'),
    ('Unlike', 'Unlike')
)


class Like(models.Model):
    # To know Who liked
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    value = models.CharField(choices=LIKE_CHOICES, default='Like', max_length=8)
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.post}-{self.user}-{self.value}"

    def user_liked_post(sender, instance, *args, **kwargs):
        like = instance
        if like.value=='Like':
            post = like.post
            sender = like.user
            notify = Notification(post=post, sender=sender, user=post.author, notification_type=1)
            notify.save()


    def user_unlike_post(sender, instance, *args, **kwargs):
        like = instance
        post = like.post
        sender = like.user
        notify = Notification.objects.filter(post=post, sender=sender, user=post.author, notification_type=1)
        notify.delete()


# Likes
post_save.connect(Like.user_liked_post, sender=Like)
post_delete.connect(Like.user_unlike_post, sender=Like)

这里是views.py:

def ShowNotifications(request):
    user=request.user
    notifications= Notification.objects.filter(user=user).order_by('-date')
    template= loader.get_template('notifications/notifications.html')

    context= {
        'notifications':notifications
    }
    return HttpResponse(template.render(context, request))

你可以这样试试:

from django.db import models
from django.db.models.signals import post_save, post_delete
from django.contrib.auth.models import User
from django.dispatch import receiver

# Create your models here.
class Post(models.Model):
    title = models.CharField(max_length=100, unique=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='post_author')

    def __str__(self):
        return self.title

class Like(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.post.title}@_{self.user}"

@receiver(post_save, sender=Like)
def user_liked_post(sender, instance, created, *args, **kwargs):
    try:
        if created:
            notify = Notification(
                post=instance.post,
                sender=instance.user,
                user=instance.post.author,
                notification_type=1
            )
            notify.save()
    except Exception as e:
        print('Error sending liked notification!')
        print(e)

@receiver(post_delete, sender=Like)
def user_unlike_post(sender, instance, *args, **kwargs):
    try:
        notify = Notification.objects.filter(
            post=instance.post,
            sender=instance.user,
        )
        notify.delete()
    except Exception as e:
        print('Error deleting liked notification!')
        print(e)

由于您正在删除喜欢的记录,因此记录的状态永远不会是 unlike 并且 updated 字段也不会更新。 因此,从 Like 模型中删除更新和值字段。

在下一行中,您正在从 Post 模型中获取 author,但 Post 模型中没有作者字段。

notify = Notification(post=post, sender=sender, user=post.author, notification_type=1)