[英]How to convert POST PascalCase json to snake_case in Django Rest Framework?
I have a DRF API endpoint that accepts python snake_case payloads:我有一个接受 python snake_case 有效负载的 DRF API 端点:
{
"sample_id": "",
"notes": "",
"patient_id": "",
"dob": "",
"scan_model": {
"current_time_left": "",
"scan_state": null,
"timer_configuration": {
"timer_interval": null,
"timer_length": "",
"warning_span": "",
"window_of_opportunity": ""
}
}
How to get the endpoint to accept a json with keys in PascalCase like this:如何让端点接受 json 中的 PascalCase 键,如下所示:
{
"SampleId": null,
"Notes": null,
"PateintId": "testid",
"DateOfBirth": "05/11/1995",
"ScanModel": {
"Id": 1,
"CurrentTimeLeft": "00:00:00",
"ScanState": 6,
"TimerConfiguration": {
"TimerInterval": 200,
"TimerLength": "00:15:00",
"WarningSpan": "00:02:00",
"WindowOfOpportunity": "00:05:00"
}
}
I am using Django 4.1, DRF 3.14 and python 3.11 Thanks!我正在使用 Django 4.1、DRF 3.14 和 python 3.11 谢谢!
So you can achieve this by using the JSONParser
class and a custom JSONRenderer
class.因此,您可以使用
JSONParser
class 和自定义JSONRenderer
class 来实现此目的。
You can create a custom JSONRenderer class that overrides the default render method to convert PascalCase keys to snake_case before rendering the data.您可以创建一个自定义 JSONRenderer class,它会覆盖默认的渲染方法,以便在渲染数据之前将 PascalCase 键转换为 snake_case。
So this will be your renderer:所以这将是你的渲染器:
import json
class SnakeCaseJSONRenderer(JSONRenderer):
def render(self, data, media_type=None, renderer_context=None):
# convert data keys to snake_case
data = json.loads(json.dumps(data, separators=(',', ':')))
return super().render(data, media_type=media_type, renderer_context=renderer_context)
Then in your views you can use this custom renderer by setting the renderer_class
attribute as your custom renderer class. Like this:然后在您的视图中,您可以通过将
renderer_class
属性设置为您的自定义渲染器 class 来使用此自定义渲染器。像这样:
from rest_framework import viewsets
class MyViewSet(viewsets.ModelViewSet):
renderer_classes = [SnakeCaseJSONRenderer]
Or you can add it to the settings too:或者您也可以将其添加到设置中:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.