Как преобразовать POST PascalCase json в snake_case в Django Rest Framework?
У меня есть конечная точка DRF API, которая принимает полезную нагрузку python snake_case:
{
"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": ""
}
}
Как заставить конечную точку принимать 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"
}
}
Я использую Django 4.1, DRF 3.14 и python 3.11. Спасибо!
Этого можно достичь, используя класс JSONParser
и пользовательский класс JSONRenderer
.
Вы можете создать пользовательский класс JSONRenderer, который переопределит метод рендеринга по умолчанию для преобразования ключей PascalCase в snake_case перед рендерингом данных.
Таким образом, это будет ваш рендерер:
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)
Затем в ваших представлениях вы можете использовать этот пользовательский рендерер, установив атрибут renderer_class
как класс вашего пользовательского рендерера.
Например, так:
from rest_framework import viewsets
class MyViewSet(viewsets.ModelViewSet):
renderer_classes = [SnakeCaseJSONRenderer]
Или вы можете также добавить его в настройки:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
]
}
Вы также можете использовать этот пакет