在哪里更改Django Rest Framework中的JSON响应格式?

1 投票
1 回答
1203 浏览
提问于 2025-04-30 18:15

假设我有一个模型:

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

然后我创建了一个ModelViewSet,使用了HyperLinkedSerializer,所以当我访问我的/api/mymodels这个接口时,我得到的响应是这样的:

{
    "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 个回答

2

第一个回复看起来是一个分页的响应,这个分页是由分页序列化器决定的。你可以创建一个自定义的分页序列化器,这样就能使用你想要的格式。你可以参考下面的例子:

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"}
    ]
}

分页序列化器可以通过你的设置全局设置,具体可以参考文档

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

撰写回答