Django 减少序列化程序中的冗余代码。SerializerMethodField()

Django 减少序列化程序中的冗余代码。SerializerMethodField(),django,django-models,django-forms,django-rest-framework,Django,Django Models,Django Forms,Django Rest Framework,my post serializer返回顶部注释和注释数 我在下面标记了冗余代码 class PostDetailSerializer(serializers.ModelSerializer): comments = serializers.SerializerMethodField() comment_count = serializers.SerializerMethodField() class Meta: model = Post

my post serializer返回顶部注释和注释数

我在下面标记了冗余代码

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

我认为你可以通过在帖子中预取评论来减少查询量。要尝试它,您可以将视图中的queryset更改为

Post.objects.all().prefetch_related('comment_set') 
注释集应该是你的名字,我会重复使用下面的注释集几次

然后,要使其使用预回迁,您可能需要进行更改

Comment.objects.filter_by_instance(obj)[:2] 

我不知道预取的内部结构,但我希望注释已经用该obj预取,这样就不需要新的查询了

我希望在使用时也可以从预取运行计数

obj.comment_set.objects.count()

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

预取不会有任何好处,因为对于每个方法,他执行单独的筛选查询将导致忽略预取的数据。让我尝试并测试它的性能。。我认为zaidfazil是对的,这就是为什么我建议不要使用filter_by_实例,而是从预取注释的对象查询它。我很有信心,这将使您的查询计数下降。感谢您添加更多的解释。刚刚接受了你的回答。你也能试一下这个问题吗?我想你也能解决这个问题。
obj.comment_set.objects.all()[:2] 
obj.comment_set.objects.count()