哪里可以改变django rest框架中json响应的形式?

时间:2014-10-30 22:51:37

标签: python json django django-rest-framework

假设我有一个模特:

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

然后我用HyperLinkedSerializer创建了ModelViewSet,所以当我调用我的/ 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 个答案:

答案 0 :(得分: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',
    }
}