0

最近我正在使用 drf 分页类,PageNumberPagination。我可能遇到也可能没有遇到一个奇怪的错误。官方文档提到,要覆盖 PageNumberPagination 的页面大小,我们必须创建一个自定义分页器来覆盖页面大小配置,如下所示

class StandardResultsSetPagination(PageNumberPagination):
    page_size = 100
    page_size_query_param = 'page_size'
    max_page_size = 1000
class BillingRecordsView(generics.ListAPIView):
    queryset = Billing.objects.all()
    serializer_class = BillingRecordsSerializer
    pagination_class = LargeResultsSetPagination

但是当我尝试做同样的事情时,自定义分页器使用默认设置为 100 这是我使用的片段

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

class TrendingClassesView(ListAPIView):
    pagination_class = StandardResultsSetPagination
    serializer_class = BaseClassTileSerializer
    queryset = BaseClass.objects.all()

有一刻代码工作正常,但是在页面大小玩了一段时间后,分页器刚刚停止工作,我必须做类似下面的事情才能使页面大小正常工作

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

    def get_page_size(self, request):
        return 10

这是我的休息框架设置

REST_FRAMEWORK = {
    'UPLOADED_FILES_USE_URL':
    True,
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.MultiPartParser',
        'rest_framework.parsers.FileUploadParser',
        'rest_framework.parsers.FormParser',
    ],
    "TIME_FORMAT":
    "%I:%M %p",
    "TIME_INPUT_FORMATS": ["%I:%M %p", "%H:%M"],
}

我想我可能做错了什么,但我无法找到错误。

4

2 回答 2

0

我没有看到自定义分页有任何错误,尽管您不必重写 get 方法。尝试在设置中设置默认分页类。

REST_FRAMEWORK = {
    'UPLOADED_FILES_USE_URL':
    True,
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.MultiPartParser',
        'rest_framework.parsers.FileUploadParser',
        'rest_framework.parsers.FormParser',
    ],
    "TIME_FORMAT":
    "%I:%M %p",
    "TIME_INPUT_FORMATS": ["%I:%M %p", "%H:%M"],
    'DEFAULT_PAGINATION_CLASS': 'your.path.StandardResultsSetPagination'
}

文档中也提到了:DRF pagination

PS:请同时检查查询集和视图集,错误可能来自您正在获取结果的查询。

于 2021-03-28T17:49:58.470 回答
0

是的,这可能很愚蠢,但无论如何我发现了问题。问题不在于给定的两个视图,所以我没有在这里提供正确的信息。写完上述评论后,我开始寻找是否覆盖了页面大小在别的地方所以我找到了这个

class FocusView(ListAPIView):
    authentication_classes = (JWTAuthentication, TokenAuthentication,
                              SessionAuthentication, BasicAuthentication)
    permission_classes = (IsAuthenticated, IsCustomer, )
    renderer_classes = (
        JSONRenderer,
       
    )
    pagination_class = StandardResultsSetPagination
    serializer_class = FocusTileSerializer
    pagination_class.page_size=100 #this line was the culprit here

这个视图就在我上面使用的视图的下方,所以当服务器重新加载 python 加载所有模块和文件时,这个视图覆盖了自定义分页器的 page_size。我真的不知道它是否应该这样做,但它肯定应该在文档中提及,或者我可能错过了它。

于 2021-03-29T04:45:01.040 回答