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的内容:但是get
AttributeError:“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()