【问题标题】:LimitOffsetPagination with viewsets.ViewSet in Django Rest Framework在 Django Rest 框架中使用 viewsets.ViewSet 的 LimitOffsetPagination
【发布时间】:2020-12-31 08:53:37
【问题描述】:

我们可以在 Django Rest Framework 中将 LimitOffsetPagination 与 viewsets.ViewSet 一起使用吗?

settings.py:

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": [
        "rest_framework.authentication.TokenAuthentication",
    ],
    "DEFAULT_PERMISSION_CLASSES": [
        "rest_framework.permissions.IsAuthenticated",
    ],
    "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.LimitOffsetPagination",
    "PAGE_SIZE": 100,
}

下面是我的列表视图的外观:

class UserViewSet(viewsets.ViewSet):

    pagination_class = LimitOffsetPagination

    def get_permissions(self):
        """
        Instantiates and returns the list of permissions that this view requires.
        """
        permission_classes = [IsAuthenticated]

        if self.action == "list" or self.action == "retrieve":
            permission_classes.append(UserReadPermission)
        elif self.action == "create" or self.action == "update":
            permission_classes.append(UserWritePermission)
        elif self.action == "destroy":
            permission_classes.append(UserDeletePermission)

        return [permission() for permission in permission_classes]

    def list(self, request):

        serializer = UserIndexSerializer(data=request.query_params)

        if serializer.is_valid():
            users = User.objects.all()
            serializer = UserGetSerializer(users, many=True)

            response = {"users": serializer.data, "total": len(serializer.data)}

            return AppResponse.success("User list found.", response)

        return AppResponse.error(serializer.errors, None, http_error_code=400)

    def create(self, request):
        pass

    def retrieve(self, request, pk=None):
        pass

    def update(self, request, pk=None):
        pass

    def partial_update(self, request, pk=None):
        pass

    def destroy(self, request, pk=None):
        pass

【问题讨论】:

  • 只需将pagination_class = NameOfYourPagination 添加到您的视图集中(作为类属性,而不是在 list() 方法中)。 LimitOffsetPagination 将与 PAGE_SIZE 参数一起在您的 settings.py 中设置。django-rest-framework.org/api-guide/pagination/…
  • @BriseBalloches 做到了,但分页不起作用。我还更新了添加viewsets.ViewSet的整个实现的问题
  • 你能用你的 settings.py REST_FRAMEWORK 变量 && 整个 Viewset 代码来编辑你的问题吗?
  • @BriseBalloches 我们不能将分页类的使用限制在视图或视图集本身吗?还是我们需要在整个框架范围内实现它?
  • 可以,但是还是需要在settings.py中设置REST_FRAMEWORK = {'PAGE_SIZE': 100},否则会被认为是None。

标签: django django-rest-framework django-pagination


【解决方案1】:

您可以使用 settings.py 中的以下代码为整个应用程序使用 django-rest 默认分页样式

REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 50 }

如果您需要对每个视图进行分页,您可以按照文档进行分页

class StandardResultsSetPagination(PageNumberPagination):
    page_size = 100
    page_size_query_param = 'page_size'
    max_page_size = 1000

然后在你的视图中使用它

class viewclass(APIView):
queryset = customquery
serializer_class = serializerclass
pagination_class = LargeResultsSetPagination

使用参数也可以帮助 GET https://api.example.org/accounts/?limit=100&offset=400

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-06
    • 2016-08-16
    • 2021-09-04
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2021-12-28
    相关资源
    最近更新 更多