Python 如何正确使用调度uid避免信号重复
你好 为了避免在我的项目中发送重复信号,我尝试使用Python 如何正确使用调度uid避免信号重复,python,django,django-signals,Python,Django,Django Signals,你好 为了避免在我的项目中发送重复信号,我尝试使用dispatch\u uid=“my\u unique\u identifier”进行应用 我已经搜索了几个类似的答案,并阅读了以下文档,但我不确定我遗漏了什么: 在我的项目中,有一些帖子是作者写的,每个帖子都有一个like按钮,当用户单击该按钮时,会创建通知并发送给作者 在此之前,一切正常,只发送了2个通知,而不是1个通知。我尝试了以下方法,但没有任何效果,我仍然收到2个通知 这就是: 这是Like模型。py 这是通知模型 以下是views.
dispatch\u uid=“my\u unique\u identifier”
进行应用
我已经搜索了几个类似的答案,并阅读了以下文档,但我不确定我遗漏了什么:
在我的项目中,有一些帖子是作者写的,每个帖子都有一个like按钮,当用户单击该按钮时,会创建通知并发送给作者
在此之前,一切正常,只发送了2个通知,而不是1个通知。我尝试了以下方法,但没有任何效果,我仍然收到2个通知
这就是:
这是Like模型。py
这是通知模型
以下是views.py:
def LikeView(request):
post = get_object_or_404(Post, id=request.POST.get('id'))
liked = False
current_likes = post.num_likes
user = request.user
if post.author.id == request.user.id:
messages.warning(request, 'You can not like you own Post')
else:
if post.likes.filter(id=request.user.id).exists():
post.likes.remove(request.user)
liked = False
current_likes = current_likes - 1
else:
post.likes.add(request.user)
liked = True
current_likes = current_likes + 1
post.num_likes = current_likes
post.save()
like, created = Like.objects.get_or_create(user=user, post=post)
sender = like.user
if not created:
if like.value == 'Like':
like.value = 'Unlike'
like.delete_notification(sender, post)
else:
like.value = 'Like'
like.save()
context = {
'total_likes': post.total_likes,
'liked': liked,
'post': post,
}
if request.is_ajax:
html = render_to_string('blog/like_section.html', context, request=request)
return JsonResponse({'form': html})
更新:
下面是我试图替换get_或create的内容:但是getAttributeError:“Like”对象没有属性“存在”
try:
like = Like.objects.filter(user=user, post=post)
sender = like.user
if like.exists():
like.delete()
like.delete_notification(sender,post)
else:
like = Like(user=user, post=post)
like.save()
except Like.DoesNotExist:
like = Like(user=user, post=post)
if like.value == 'Like':
like.value = 'Unlike'
like.delete_notification(sender, post)
else:
like.value = 'Like'
like.save()
我的问题是如何正确使用dispatch\u uid=“My\u unique\u identifier”以避免重复信号?您创建了like并再次保存了它。这就是为什么:
like, created = Like.objects.get_or_create(user=user, post=post)
获取或创建
的意思如下:
try:
obj = Person.objects.get(first_name='John', last_name='Lennon')
except Person.DoesNotExist:
obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
obj.save()
因为在你的例子中,每次点击都是一个新对象(我想是吧)?然后,get\u或\u create
将转到中,除了和save()
。所以你存了两次钱
以下内容可能会解决您在评论中提到的“喜欢->不喜欢->喜欢”的问题
替换:
like, created = Like.objects.get_or_create(user=user, post=post)
sender = like.user
if not created:
if like.value == 'Like':
like.value = 'Unlike'
like.delete_notification(sender, post)
else:
like.value = 'Like'
like.save()
与
您创建了like并再次保存。这就是为什么:
like, created = Like.objects.get_or_create(user=user, post=post)
获取或创建
的意思如下:
try:
obj = Person.objects.get(first_name='John', last_name='Lennon')
except Person.DoesNotExist:
obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
obj.save()
因为在你的例子中,每次点击都是一个新对象(我想是吧)?然后,get\u或\u create
将转到中,除了和save()
。所以你存了两次钱
以下内容可能会解决您在评论中提到的“喜欢->不喜欢->喜欢”的问题
替换:
like, created = Like.objects.get_or_create(user=user, post=post)
sender = like.user
if not created:
if like.value == 'Like':
like.value = 'Unlike'
like.delete_notification(sender, post)
else:
like.value = 'Like'
like.save()
与
你有views.py在哪里保存like吗?在我看来,你保存了两次like。有可能是您首先创建了对象,然后在代码中的某个地方对其进行了更新。@ha neul我已经用post detail视图和like视图更新了我的问题。您是否有views.py like保存在哪里?在我看来,您保存了两次。可能是您首先创建了对象,然后在代码中的某个地方对其进行了更新。@ha neul我已使用“发布详细信息”视图和类似视图更新了我的问题您是对的,但有一个问题是,当用户再次取消喜欢并尝试创建类似对象时,它会重新发送通知。我的意思是,我需要保存它,以便在重复出现“喜欢”和“不喜欢”时,通过创建或删除通知,您可以通过重新编写try:
逻辑来解决这个问题吗?您可以将与它中的部分合并。我用我的解决方案进行了更新。想法就在这里,你可能需要调整一下。我已经用试用版更新了我的问题,但我收到了属性错误:“Like'object has not attribute'exists”
我现在处于学习阶段,所以感谢你解释这是因为你使用过滤器来获取Like
,这是queryset。您提到like.user,quesryset没有user。您需要使用get
来获取对象。您是对的,但存在一个问题,即当用户取消喜欢并再次尝试创建类似对象时,它会重新发送通知。我的意思是,我需要保存它,以便在重复出现“喜欢”和“不喜欢”时,通过创建或删除通知,您可以通过重新编写try:
逻辑来解决这个问题吗?您可以将与它中的部分合并。我用我的解决方案进行了更新。想法就在这里,你可能需要调整一下。我已经用试用版更新了我的问题,但我收到了属性错误:“Like'object has not attribute'exists”
我现在处于学习阶段,所以感谢你解释这是因为你使用过滤器来获取Like
,这是queryset。您提到like.user,quesryset没有user。您需要使用get
获取对象。
try:
like =Like.objects.get(user=user, post=post)
like.delete()
like.delete_notification(sender, post) # this part seems weird, you did not define ```sender``` in this view.
except Like.DoesNotExist:
like = Like(user=user, post=post)
like.save()