简体   繁体   English

如何在 Django Rest 框架中将 POST PascalCase json 转换为 snake_case?

[英]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',
    ]
}

You can also use this package您也可以使用这个package

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM