如何防止 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)
我添加了一条通知,每当用户向 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)