Как преобразовать 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',
    ]
}

Вы также можете использовать этот пакет

Вернуться на верх