首页 > 解决方案 > Django Rest 框架:使用 ListModelMixin 进行分页

问题描述

我一直在关注 django-rest-framework 文档示例,但是在使用 `ListModelMixin 和 viewsets.GenericViewset 时无法正常工作

这不会分页:

class InvitesViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    permission_classes = [IsAuthenticated]
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def list(self, request):
        invited_users = self.get_queryset() # just did this as a test
        serializer = UserSerializer(invited_users, many=True)
        return Response(serializer.data)

虽然这样做:

class InvitesViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    permission_classes = [IsAuthenticated]
    queryset = User.objects.all()
    serializer_class = UserSerializer

如何在使用 ListModelMixin 时返回带有分页的自定义列表响应(因为我需要过滤 request.user)?

标签: pythondjangodjango-rest-framework

解决方案


在您看来,您只是覆盖了默认list()功能,这样您就删除了分页部分。

看代码ListModelMixin

class ListModelMixin:
    """
    List a queryset.
    """
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

如果您需要使用过滤结果,请使用def get_queryset()函数

def get_queryset(self):
    queryset = super(FooView, self).get_queryset()
    queryset = queryset.filter(foo=bar)
    return queryset

推荐阅读