You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST API对接JavaScript的命名规范适配问题

解决Django REST API与JavaScript命名规范差异的方案

后端自动处理命名转换(无需前端修改)

这是最实用的方案,让前后端各自遵循自身社区的命名规范,通过后端的序列化/反序列化环节自动完成格式转换。

自定义DRF渲染器与解析器

手动实现snake_case和camelCase的双向转换逻辑:

  1. 将后端snake_case转为前端camelCase的渲染器
from rest_framework.renderers import JSONRenderer
import re

def snake_to_camel(s):
    components = s.split('_')
    return components[0] + ''.join(x.title() for x in components[1:])

class CamelCaseJSONRenderer(JSONRenderer):
    def render(self, data, accepted_media_type=None, renderer_context=None):
        def convert(obj):
            if isinstance(obj, list):
                return [convert(item) for item in obj]
            elif isinstance(obj, dict):
                return {snake_to_camel(k): convert(v) for k, v in obj.items()}
            return obj
        
        camel_data = convert(data)
        return super().render(camel_data, accepted_media_type, renderer_context)
  1. 将前端camelCase转为后端snake_case的解析器
from rest_framework.parsers import JSONParser

def camel_to_snake(s):
    return re.sub(r'(?<!^)(?=[A-Z])', '_', s).lower()

class SnakeCaseJSONParser(JSONParser):
    def parse(self, stream, media_type=None, parser_context=None):
        data = super().parse(stream, media_type, parser_context)
        
        def convert(obj):
            if isinstance(obj, list):
                return [convert(item) for item in obj]
            elif isinstance(obj, dict):
                return {camel_to_snake(k): convert(v) for k, v in obj.items()}
            return obj
        
        return convert(data)
  1. 配置使用
    全局配置(在settings.py中):
REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'your_app.renderers.CamelCaseJSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',  # 保留调试用的浏览器渲染器
    ],
    'DEFAULT_PARSER_CLASSES': [
        'your_app.parsers.SnakeCaseJSONParser',
    ]
}

也可以在单个视图类中单独指定:

from rest_framework.views import APIView

class UserAPIView(APIView):
    renderer_classes = [CamelCaseJSONRenderer]
    parser_classes = [SnakeCaseJSONParser]

使用第三方库简化

直接使用成熟的第三方库djangorestframework-camel-case,省去自己编写转换逻辑的麻烦:

pip install djangorestframework-camel-case

然后在settings.py中配置:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'djangorestframework_camel_case.render.CamelCaseJSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ],
    'DEFAULT_PARSER_CLASSES': [
        'djangorestframework_camel_case.parser.CamelCaseJSONParser',
    ],
}

统一命名规范的选择

如果不想做转换,也可以考虑统一规范,但各有优劣:

  • 统一用snake_case:后端无需改动,前端虽然不符合JS社区惯例,但变量名依然可用,只是不够"地道"。
  • 统一用camelCase:前端符合习惯,但后端要违反PEP8规范(Python社区普遍使用snake_case),长期维护会显得别扭,也不符合Python的最佳实践。

综上,后端自动转换是最优解,既能让前后端各自遵循习惯,又不需要任何一方妥协。

内容的提问来源于stack exchange,提问作者ayitinya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:50:27