我的帖子序列化程序返回热门评论和评论数量
我在下面标记了冗余代码。
class PostDetailSerializer(serializers.ModelSerializer):
comments = serializers.SerializerMethodField()
comment_count = serializers.SerializerMethodField()
class Meta:
model = Post
fields = (
...
'comments',
'comment_count',
)
# showing the most recent comments
def get_comments(self, obj):
content_type = obj.get_content_type <<
object_id = obj.id <<
comments = Comment.objects.filter_by_instance(obj)[:2] <<
return CommentSerializer(comments, many=True).data
# showing the number of comments
def get_comment_count(self, obj):
content_type = obj.get_content_type <<
object_id = obj.id <<
comments_count = Comment.objects.filter_by_instance(obj).count() <<
return comments_count
它本身工作正常但我不想在它遇到PostDetailSerializer时查询N x 2行
expected output is below
.....
"comments": [
{
...
"content": "Edited!",
...
},
{
...
"content": "New wwaa!",
...
}
],
"comment_count": 4
答案 0 :(得分:1)
我认为您可以通过在帖子中预取评论来最小化查询量。要尝试它,您可以在视图中更改您的查询集
Post.objects.all().prefetch_related('comment_set')
其中comment_set应该是你的反向aka related_name(我将在几次以下重复使用comment_set)。
然后要使用预取,您可能需要更改
Comment.objects.filter_by_instance(obj)[:2]
到
obj.comment_set.objects.all()[:2]
我不知道预取的内部结构,但是我希望这些评论已经预先用了这个标题,所以这不需要新的查询。
我希望在您使用
时也可以从预取中运行计数obj.comment_set.objects.count()
有兴趣听听这是否有助于查询倒计时!另外,请注意预取也会在某些情况下损害性能,网上有一些有趣的文章。