django - Django REST框架:如何用额外的字段包装响应......并在数据字段中提供当前响应
问题描述
所以,我有以下内容:
class ObjectViewSet(
mixins.CreateModelMixin,
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.DestroyModelMixin,
viewsets.GenericViewSet
):
"""
REST API endpoints for Objects.
"""
serializer_class = ObjectSerializer
queryset = Object.objects.all()
例如,对于列表GET
请求,这将返回:
[
{
"uuid": "787573a2-b4f1-40df-9e3a-8555fd873461",
},
{
"uuid": "2ab56449-1be1-47d7-aceb-a9eaefa49665",
}
]
但是,我怎样才能稍微改变这个 mixins 的响应,使其类似于以下内容:
{
success: true,
message: 'Some Extra Useful Message',
data: [
{
"uuid": "787573a2-b4f1-40df-9e3a-8555fd873461",
},
{
"uuid": "2ab56449-1be1-47d7-aceb-a9eaefa49665",
}
]
}
这可能吗,还是我应该只编写自己的自定义端点Response()
而不利用 DRF 的mixins
功能?
所以,本质上,切换自定义:
Response(data, status=None, template_name=None, headers=None, content_type=None)
至:
response = {
'success': true,
'message': 'Some Extra Useful Message',
'data': serializer.data
}
Response(response, status=None, template_name=None, headers=None, content_type=None)
解决方案
经过长时间的研究,我发现这很有用并且最适合使用。对于此类用例,必须参考此文档。在您的情况下,您可以执行以下操作 -
声明一个类renderer.py
from rest_framework.renderers import JSONRenderer
from rest_framework.utils import json
class JSONResponseRenderer(JSONRenderer):
# media_type = 'text/plain'
# media_type = 'application/json'
charset = 'utf-8'
def render(self, data, accepted_media_type=None, renderer_context=None):
response_dict = {
'status': 'failure',
'data': data,
'message': '',
}
data = response_dict
return json.dumps(data)
更新你的settings.py
REST_FRAMEWORK = {
# Other code
'DEFAULT_RENDERER_CLASSES': (
'<app-name>.renderer.JSONResponseRenderer',
)
}
更新您的 ViewSet 类
class YourViewSet(viewsets.ModelViewSet):
# Other code
renderer_classes = [JSONResponseRenderer]
你都准备好了!另请参阅此帖子更多。
推荐阅读
- sql - 如果Postgres sql中2个连接表之间的记录数不相等,如何随机更新列
- jenkins - Jenkins Pipeline 获取拒绝者名称而不是用户 ID
- tensorflow - 预编译的 Tensorflow 比从源 CPU 优化构建的 TF 更快,如何重现预编译的?
- python - 带有树莓派 cv.cvtColor(frame, cv.COLOR_BGR2HSV) 的 OpenCV 没有显示正确的颜色
- r - 为什么 R 会删除一些残差以及如何避免它?
- reactjs - 你能在没有原生反应的情况下构建一个移动(iOS/andriod)应用程序吗?
- json - vans怎么有小尺寸的json 3d模型
- javascript - 从 JSON 中获取以两个大括号开头的键值
- node.js - 部署Node App时,Heroku找不到组件文件路径,本地运行正常
- mysql - 如何使用三个表选择差异?