django 为什么这个视图集是即时的而这个视图集非常慢

a64a0gku  于 2022-12-24  发布在  Go
关注(0)|答案(2)|浏览(154)

我的第一个视图集:

class BienAll(generics.ListAPIView):
    queryset = FacebookBien.objects.all()
    pagination_class = SmallPagesPagination
    def get(self, request, *args, **kwargs):
        serializer = FacebookBienSerializer(self.queryset.all(), many=True)
        page = self.paginate_queryset(serializer.data)
        return self.get_paginated_response(page)

我的第二个视图集:

class Test(generics.ListAPIView):
    queryset = FacebookBien.objects.all()
    pagination_class = SmallPagesPagination
    serializer_class = FacebookBienSerializer

我的第二个视图集是即时的,但我的第一个是缓慢的,我不明白为什么。

hjqgdpho

hjqgdpho1#

我猜这是分页发生的顺序。
在第一个例子中,你序列化所有的数据,然后再次访问它来分页它的一个子集。我希望DRF足够聪明,在获取所有项之前分页。
如果您希望得到类似的结果,可以在序列化查询集之前,根据分页器返回的条目数对查询集进行切片--但是只使用第二个版本要好得多。

b5buobof

b5buobof2#

根据该参考文献:https://docs.djangoproject.com/en/3.2/ref/models/querysets/#django.db.models.query.QuerySet.prefetch_related
如果FacebookBien有一个ManyToMany列,则可以使用此prefetch_related

FacebookBien.objects.all().prefetch_related('many_to_many_column')

相关问题