【问题标题】:Context Aware Browsable API Rendering in Django RESTDjango REST 中的上下文感知可浏览 API 渲染
【发布时间】:2014-08-13 02:08:21
【问题描述】:

是否有一种简单的方法可以在 Django Rest Browsable API 中创建超链接,但在其他 API 呈现中没有。为了清楚起见,我想在通过可浏览 API 查看页面时将某些字段呈现为超链接,但在通过 JSON 呈现时仅呈现文本组件。

此用例的一个示例是将列表视图中的 pk 呈现为指向详细视图的超链接(类似于:http://chibisov.github.io/drf-extensions/docs/#resourceurifield),但仅在以可浏览 API 模式查看列表视图时执行此操作。在常规的 json GET 中,我只想渲染 pk。

我希望通过浏览器访问时使可浏览的 API 更有用/可导航。

这是否相关:http://www.django-rest-framework.org/api-guide/renderers#browsableapirenderer

更一般地说,是否可以将排除设置为依赖于渲染模式?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您可以通过覆盖GenericAPIView 或其任何子类上的get_serializer 方法,在不同的上下文中返回不同的序列化程序。

    这样的事情是对的......

    def get_serializer(self, ...):
        if self.request.accepted_renderer.format == 'api':
            # Browsable style
        else:
            # Standard style
    

    如果您将该行为编码为一个 mixin 类,您就可以轻松地在整个视图中重用它。

    【讨论】:

    • 您实际上必须与'api' 的格式而不是 HTML 进行比较。
    • @AlexRothberg - 谢谢。现已更正。
    【解决方案2】:

    我创建了这个 mixin 以在 API 模式下使用 serializer_class_api:

    class SerializerAPI(object):
        def get_serializer_class(self, *args, **kwargs):
            parent = super(SerializerAPI, self).get_serializer_class(*args, **kwargs)
            if (hasattr(self.request, 'accepted_renderer') and 
              self.request.accepted_renderer.format == 'api'):
                return self.serializer_class_api
            else:
                return parent
    

    【讨论】:

      猜你喜欢
      • 2013-06-24
      • 2014-11-03
      • 2018-12-25
      • 2020-05-23
      • 2016-03-24
      • 1970-01-01
      • 2013-08-26
      • 2015-11-25
      • 2016-03-24
      相关资源
      最近更新 更多