如何获得"数据"而不是"结果"使用Django Rest Framework ReadOnlyModelViewSet?

时间:2018-05-09 00:08:04

标签: django django-rest-framework json-api

我已经阅读了这个问题How to generate JSON-API data attribute vs results attribute in Django Rest Framework 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,)

从那里返回的数据很好,除了它有一个"结果"属性而不是数据"属性。

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

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

但这对我没什么影响,事实上我已经有了全局设置,我相信它会覆盖像这样的渲染和解析器方面

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',
}

所以我很想知道最近有人是否已经这样做过以及他们是如何做到的?

BTW我有其他基于ModelViewSet的API端点可以正常工作并提供数据"属性而不是"结果" ......这里是其中一个

的例子
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)

1 个答案:

答案 0 :(得分:4)

pagination.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)
        ]))

settings.py

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

}

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

class FruitTestReadOnlyViewSet(viewsets.ReadOnlyModelViewSet):
    pagination_class = Pagination

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