减少serializers.SerializerMethodField()中的冗余代码

时间:2017-09-19 09:49:30

标签: django django-models django-forms django-rest-framework

我的帖子序列化程序返回热门评论评论数量

我在下面标记了冗余代码。

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 

1 个答案:

答案 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()

有兴趣听听这是否有助于查询倒计时!另外,请注意预取也会在某些情况下损害性能,网上有一些有趣的文章。