Django 减少序列化程序中的冗余代码。SerializerMethodField()
my post serializer返回顶部注释和注释数 我在下面标记了冗余代码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
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()