在REST框架

时间:2015-10-23 15:24:56

标签: python django django-rest-framework

我正在将一组现有的API从tastypie转换为REST框架。默认情况下,在执行列表API时,tastypie返回包含对象列表和元数据字典的字典,其中REST框架只返回一个对象数组。例如,我有一个名为Site的模型。 Tastypie返回一个类似于

的字典
{
  "meta": 
    { ... some data here ...}, 
  "site": 
    [
      {... first site...}, 
      {...second site...}
      ...
    ]
}

其中REST框架只返回数组

[
  {... first site...}, 
  {...second site...}
  ...
]

我们没有以任何方式使用tastypie的元数据。在REST框架中更改返回值的最小侵入方法是什么?我可以覆盖list(),但我宁愿让REST框架尽可能地做它。

3 个答案:

答案 0 :(得分:4)

我认为您必须覆盖list()方法。

我们首先得到原始回复。然后我们使用data属性在响应上设置自定义表示,并使用此自定义表示返回响应。

class MyModelViewSet(viewsets.ModelViewSet):

    def list(self, request, *args, **kwargs):
        response = super(MyModelViewSet, self).list(request, *args, **kwargs) # call the original 'list'
        response.data = {"site": response.data} # customize the response data
        return response # return response with this custom representation

答案 1 :(得分:0)

您可以使用DjangoRestMultipleModels插件

进行探索

如果你有一个模型的meta和另一个模型的网站你可以做

from drf_multiple_model.views import MultipleModelAPIView

class SiteAPIListView(MultipleModelAPIView):
    queryList = [
        (Meta.objects.all(),MetaSerializer),
        (Site.objects.filter(meta='some_specific_meta'),SiteSerializer),
    ....
]

这将完全返回您想要的内容

{
  "meta": 
    { ... some data here ...}, 
  "site": 
    [
      {... first site...}, 
      {...second site...}
      ...
    ]
}

希望这有助于避免不必要的胶水代码。 主要是库允许您将许多序列化程序和/或模型组合到单个API调用中。这在django rest框架中没有开箱即用。但是,即使两个结果都来自相同的模型,也可以使用不同的查询集用于具有不同序列化程序的相同模型,因此也可以在您的情况下使用。或两者的结合。它提供了极大的灵活性,模型和序列化器的所有排列。

答案 2 :(得分:0)

我有同样的问题。我发现最非侵入性的方法是通过一个专门的分页类来处理这个问题,它就是这样做的:响应打包。

查看CustomPagination实施:http://www.django-rest-framework.org/api-guide/pagination/#custom-pagination-styles