【问题标题】:How to get "data" rather than "results" with Django Rest Framework ReadOnlyModelViewSet?如何使用 Django Rest Framework ReadOnlyModelViewSet 获取“数据”而不是“结果”?
【发布时间】:2018-10-19 00:08:21
【问题描述】:

我已经阅读了这个问题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',
}

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


顺便说一句,我还有其他基于 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)

【问题讨论】:

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


    【解决方案1】:

    分页.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) 即可。

    【讨论】:

    • 谢谢!我很感激。我目前无法尝试此操作,但我有些担心。据我所知,这将影响所有 API 端点(即当前运行良好的端点)。有什么方法可以将 Pagination 类应用到 ReadOnlyModelViewSet one 吗?再次感谢。
    • 我忘记在最后一条评论中对您进行 ping 操作,现在我似乎无法编辑评论以包含您的用户 ID,所以...请您看看我在此评论上方的评论好吗?
    • 我忘记在最后一条评论中对您进行 ping 操作,现在我似乎无法编辑评论以包含您的用户 ID,所以...请您看看我在此评论上方的评论好吗?
    • Err 似乎无法在评论中包含您的用户名 - 又一次尝试这样做。
    • 太好了,感谢您的更新。我现在不能尝试,但我稍后会这样做。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2016-08-03
    • 2022-01-24
    • 2019-11-06
    • 1970-01-01
    • 2022-08-18
    • 2017-02-02
    相关资源
    最近更新 更多