2014-06-23 46 views
3

是否有一種簡單的方法可以在Django Rest Browsable API中創建超鏈接,但不能在其他API呈現中創建超鏈接。要明確我想通過可瀏覽的API查看頁面時將某些字段呈現爲超鏈接,但僅在通過JSON呈現時呈現文本組件。在Django REST中上下文感知可瀏覽的API呈現

此用例的一個示例是將列表視圖中的pk呈現爲與詳細信息視圖(類似於:http://chibisov.github.io/drf-extensions/docs/#resourceurifield)的超鏈接,但僅在以可瀏覽的API方式查看列表視圖時纔會執行此操作。在常規的json GET中,我想渲染pk。

我希望通過瀏覽器訪問時,可瀏覽的API更具可用性/可導航性。

這是有什麼相關的:http://www.django-rest-framework.org/api-guide/renderers#browsableapirenderer

更一般地說,有無論如何設置排除依賴於渲染模式?

回答

3

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

像這樣的事情會有關的權利......

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

如果你的代碼的行爲作爲一個混合類你再能輕鬆地重用它在你的看法。

+0

你確實有來比較的格式''api''不是HTML。 –

+0

@AlexRothberg - 謝謝。現在更正。 –

1

我創造了這個混入時使用serializer_class_api在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 
+0

完美,謝謝! – simon

相關問題