如何使用 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"
},
]
}
我想实现的是获取所有基于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"
},
]
}