如何使用 Django Query 计算给定照片中评论的回复数量?

How to Count the number of replies from a comment in a given photo using Django Query?

我想实现的是获取所有基于photo_id的评论,同时统计总回复

models.py:

    class PhotoComment(models.Model):
        user = models.ForeignKey(User,on_delete=models.CASCADE)
        photo = models.ForeignKey(UserPhoto,on_delete=models.CASCADE)
        comment_text = models.TextField(max_length = 500)
        comment_reply = models.ForeignKey('self',related_name='replies',blank=True,null=True,on_delete = models.CASCADE)
        ...
        def __str__(self):
            return '%s(photo_%s)' %(self.user,self.photo)

views.py:


    class PhotoCommentView(APIView):
        def patch(self,request,formate=None):
            photo_id = request.data.get('photo_id')
            all_comment = list(PhotoComment.objects.filter(photo__id = photo_id,comment_reply = None).values('id','user__username','comment_text','user__profile__profile_pic','vote_upvote').annotate(total_reply = Count('comment_reply')))
            return Response({"Data" : all_comment},status=status.HTTP_200_OK)

实际结果是这样的:


    {
        "Data": [
            {
                "id": 12,
                "user__username": "pradip",
                "comment_text": "this is awesome pic bro....",
                "user__profile__profile_pic": "profile_pic/gyroscope_HUq0uJ0.png",
                "vote_upvote": 2,
                "total_reply": 0⬅⬅⬅⬅
            },
            ...
               ]
    }

我要的结果是这样的(这里的评论id 12 总共有3 回复。):


     {
            "Data": [
                {
                    "id": 12,
                    "user__username": "pradip",
                    "comment_text": "this is awesome pic bro....",
                    "user__profile__profile_pic": "profile_pic/gyroscope_HUq0uJ0.png",
                    "vote_upvote": 2,
                    "total_reply": 3⬅⬅⬅⬅
                },
                ....
                    ]
     }

我不知道这个问题,我需要一些帮助。

如果您知道实现此目的的任何其他简单或推荐的解决方案,请告诉我。

谢谢。

正如其他人所说,属性是指特定的对象实例。查询集用于对一系列对象执行操作。

因此,要为查询集复制您为对象实例定义的 属性,您需要设置注释:

from django.db.models import Count
all_comment = list(PhotoComment.objects.annotate(total=Count('comment_reply')
   ).filter(photo__id =  request.data.get('photo_id')
   ).values('id','comment_text','total'))
    

希望这里解释的一般原则能让你到达你想去的地方

我在serializer中使用SerializerMethodField()来计算评论回复。

serializers.py:

class ShowCommentSerializer(serializers.ModelSerializer):
        total_reply = SerializerMethodField()
        user_name = serializers.CharField(source='user.username')
        profile_pic = serializers.CharField(source='user.profile.profile_pic')
            
        class Meta:
            model = PhotoComment
            fields = ('id','user_name','profile_pic','comment_text','total_reply','created_date')
            read_only_fields = fields
            
        def get_total_reply(self, obj):
            total = obj.replies.count()
            return total

views.py:

class PhotoCommentView(APIView):
    def patch(self,request,formate=None):
        photo_id = request.data.get('photo_id')
        comment_inst = PhotoComment.objects.filter(photo = photo_id,comment_reply=None)
        serializer = ShowCommentSerializer(comment_inst,many=True)
        return Response({"Data" : serializer.data},status=status.HTTP_200_OK)

输出:

{
    "Data": [
        {
            "id": 29,
            "user_name": "admin",
            "profile_pic": "profile_pic/Airbus.png",
            "comment_text": "good bro....",
            "total_reply": 3,
            "created_date": "2021-03-10T02:25:43.940127+05:30"
        },
     ]
}