2014-10-30 87 views
0

可以说,我有一个模型:在Django rest框架中,如何更改json响应的形式?

class MyModel(models.Model): 
    name = models.CharField(max_length=100) 
    description= models.TextField() 
    ... 

然后创建ModelViewSet与HyperLinkedSerializer,所以当我把我的/ API/mymodels endpint我得到的反应是这样的:

{ 
    "count": 2, 
    "next": null, 
    "previous": null, 
    "results": [ 
     { "name": "somename", "description": "desc"}, 
     { "name": "someothername", "description": "asdasd"}, 
    ] 
} 

,当我打电话/ API/mymodels/1,我得到:

{ "name": "somename", "description": "asdasd"} 

但我想获得的是:

{ 
    "metadata":{ ...}, 
    "results": { "name": "somename", "description": "desc"} 
} 

我想在我的网站上为所有模型使用这种格式,所以我不想更改每个视图集,我想在一个类中实现它(最有可能),然后将其用于所有视图集。

所以我的问题是:哪个渲染器或序列化程序或其他类(我真的不知道)应该改变或创建以获得这种行为的JSON响应?

回答

1

第一个响应似乎是由分页序列化程序确定的分页响应。您可以创建将使用自定义格式的a custom pagination serializer。您正在寻找类似如下的内容:

class MetadataSerialier(pagination.BasePaginationSerializer): 
    count = serializers.Field(source='paginator.count') 
    next = NextPageField(source='*') 
    previous = PreviousPageField(source='*') 


class CustomPaginationSerializer(pagination.BasePaginationSerializer): 
    metadata = MetadataSerializer(source='*') 

这应该给你类似以下的输出:

{ 
    "metadata": { 
     "count": 2, 
     "next": null, 
     "previous": null 
    }, 
    "results": [ 
     { "name": "somename", "description": "desc"}, 
     { "name": "someothername", "description": "asdasd"} 
    ] 
} 

分页串行器可以通过设置,as described in the documentation全局设置。

REST_FRAMEWORK = { 
    'DEFAULT_PAGINATION_SERIALIZER_CLASS': { 
     'full.path.to.CustomPaginationSerializer', 
    } 
}