如何使用 Django Rest Framework ReadOnlyModelViewSet 获取“数据”而不是“结果”?

gla*_*con 3 django django-rest-framework json-api

我已经阅读了这个问题如何在 Django Rest Framework JSON API 中生成 JSON-API 数据属性与结果属性?但是接受的答案对我不起作用,而且我的情况未涵盖其中。

我正在使用 Django Rest Framework (3.5.3) 来提供 API 端点。该终点基于

class FruitTestReadOnlyViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Fruit.objects.all()
    serializer_class = FruitSerializer
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)
Run Code Online (Sandbox Code Playgroud)

从那里返回的数据很好,只是它具有“结果”属性而不是“数据”属性。

我上面提到的问题建议你这样做

class FruitTestReadOnlyViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Fruit.objects.all()
    serializer_class = FruitSerializer
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)
    renderer_classes = (JSONRenderer,)
    parser_classes = (JSONParser,)
Run Code Online (Sandbox Code Playgroud)

但这对我来说没有区别,事实上我已经有了全局设置,我相信它涵盖了渲染和解析器方面

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
    'PAGE_SIZE': 10,
    'EXCEPTION_HANDLER': 'rest_framework_json_api.exceptions.exception_handler',
    'DEFAULT_PAGINATION_CLASS':
        'rest_framework_json_api.pagination.PageNumberPagination',
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework_json_api.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser'
    ),
    'DEFAULT_RENDERER_CLASSES': (
        'djangorestframework_camel_case.render.CamelCaseJSONRenderer',
        'rest_framework_json_api.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ),
    'DEFAULT_METADATA_CLASS': 'rest_framework_json_api.metadata.JSONAPIMetadata',
}
Run Code Online (Sandbox Code Playgroud)

所以我很想知道最近是否有人这样做了,他们是如何做到的?


顺便说一句,我还有其他 API 端点,ModelViewSet它们可以正常工作并提供“数据”属性而不是“结果”……这是其中一个的示例

class TreeViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows Tree to be CRUDed.
    """
    queryset = Tree.objects.all()
    serializer_class = TreeSerializer
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)

    def get_queryset(self):
        return Tree.objects.filter(username=self.request.user)
Run Code Online (Sandbox Code Playgroud)

Ykh*_*Ykh 5

分页.py

from collections import OrderedDict
from rest_framework.response import Response

class Pagination(PageNumberPagination):

    def get_paginated_response(self, data):
        return Response(OrderedDict([
            ('count', self.page.paginator.count),
            ('next', self.get_next_link()),
            ('previous', self.get_previous_link()),
            ('data', data)
        ]))
Run Code Online (Sandbox Code Playgroud)

设置.py

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':
        'path_to_pagination.pagination.Pagination',

}
Run Code Online (Sandbox Code Playgroud)

如果您只想将其应用于类FruitTestReadOnlyViewSet,请不要更改 settings.py 并为此类设置 pagination_class:

class FruitTestReadOnlyViewSet(viewsets.ReadOnlyModelViewSet):
    pagination_class = Pagination
Run Code Online (Sandbox Code Playgroud)

将默认分页get_paginated_response方法从('results', data)to更改即可('data', data)