【问题标题】:How to generate JSON-API data attribute vs results attribute in Django Rest Framework JSON API?如何在 Django Rest Framework JSON API 中生成 JSON-API 数据属性与结果属性?
【发布时间】:2016-05-23 07:39:38
【问题描述】:

我有一个使用 Django Rest Framework JSON API 的 django 1.9.2 项目:

https://github.com/django-json-api/django-rest-framework-json-api:

我的视图如下所示:

class QuestionViewSet(viewsets.ReadOnlyModelViewSet):
    """
    API endpoint that allows questions and answers to be read.
    """
    resource_name = 'questions'
    queryset = Question.objects.all()
    serializer_class = QuestionSerializer
    renderers = renderers.JSONRenderer
    parsers = parsers.JSONParser

典型响应如下所示:

{"links": {"first": "http://testserver/api/v1/coaches?page=1", "last": "http://testserver/api/v1/coaches?page=1", "next": null, "prev": null}, "results": [{"id": 1, "created": "2016-02-11T02:41:22.569000Z", "updated": null, "deleted": null, "uuid": "0473c709-994f-465b-989e-407c623f365f", "user": {"type": "User", "id": "2"}}, {"id": 2, "created": "2016-02-11T02:41:46.853000Z", "updated": null, "deleted": null, "uuid": "36e19c0e-bda6-4bd7-bc73-374a6fc509d6", "user": {"type": "User", "id": "3"}}, {"id": 3, "created": "2016-02-11T02:42:05.419000Z", "updated": null, "deleted": null, "uuid": "d0798ff4-3be2-4cf3-81ac-edf8049eb075", "user": {"type": "User", "id": "4"}}], "meta": {"pagination": {"page": 1, "pages": 1, "count": 3}}}

我希望输出具有数据属性而不是结果属性。如何告诉 DRF JSON API 输出此处描述的样式:

http://jsonapi.org/format/

【问题讨论】:

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


    【解决方案1】:

    我的问题是我在视图中有一个视图集派生类,如下所示:

    class QuestionViewSet(viewsets.ReadOnlyModelViewSet):
        """
        API endpoint that allows questions and answers to be read.
        """
        resource_name = 'questions'
        queryset = Question.objects.all()
        serializer_class = QuestionSerializer
        renderers = renderers.JSONRenderer
        parsers = parsers.JSONParser
    

    这是错误。 renderers 和 parser 属性实际上分别是 renderer_classes 和 parser_classes。此外,这些属性的右值是 tuples,而不是 singletons。因此:

    class QuestionViewSet(viewsets.ReadOnlyModelViewSet):
        """
        API endpoint that allows questions and answers to be read.
        """
        resource_name = 'questions'
        queryset = Question.objects.all()
        serializer_class = QuestionSerializer
        renderer_classes = (renderers.JSONRenderer,)
        parser_classes = (parsers.JSONParser,)
    

    在此更改之后,JSON API 响应基本正确:

    {"data":{"type":"questions","id":"1","attributes":{"created":"2016-02-10T04:28:50.742000Z","updated":null,"deleted":null,"uuid":"eddfc27d-2677-49e5-bd37-92fecea340bd","text":"Are you dizzy?"},"relationships":{"answers":{"data":[{"type":"Answer","id":"1"},{"type":"Answer","id":"2"},{"type":"Answer","id":"3"}]},"members":{"data":[{"type":"Member","id":"1"},{"type":"Member","id":"2"},{"type":"Member","id":"3"},{"type":"Member","id":"4"}],"meta":{"count":4}}}}}
    

    【讨论】:

    • 所以问题与我的建议不同?我很困惑:D
    【解决方案2】:

    我相信您必须创建一个自定义渲染器才能处理您的项目。这是来自rest-framework renderers的指南

    我可以将您指向 json 模板的 Response 类中的行,以进行快速而肮脏的修复: Response(), line 35

    【讨论】:

    • 感谢您的回复。这帮助我调试了上面提到的正确答案。
    猜你喜欢
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2016-05-10
    • 1970-01-01
    • 2016-01-11
    相关资源
    最近更新 更多