Django Rest Framework:带 ListModelMixin 的分页

aro*_*ooo 1 python django django-rest-framework

我一直在关注 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)
Run Code Online (Sandbox Code Playgroud)

虽然这样做:

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

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

小智 5

在您看来,您刚刚覆盖了默认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)
Run Code Online (Sandbox Code Playgroud)

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

def get_queryset(self):
    queryset = super(FooView, self).get_queryset()
    queryset = queryset.filter(foo=bar)
    return queryset
Run Code Online (Sandbox Code Playgroud)