为什么 drf 在序列化的 dictfield 中添加下划线?

Why drf add underlines to serialized dictfield?

我用的是djangorestframework==3.9.4,不明白drf为什么要改序列化数据(在字段名数字和大写前加下划线)

# views.py:

class RetrieveUpdateJsonFields(mixins.RetrieveModelMixin,
                                mixins.UpdateModelMixin,
                                viewsets.GenericViewSet):
    queryset = JsonFieldObject.objects.all()

    serializers = {
        'default': JsonFieldRetriveSerializer,
        'update': JsonFieldUpdateSerializer,
    }

    def get_serializer_class(self):
        return self.serializers.get(self.action,
                                    self.serializers['default'])
                                    
        
# serializers.py:
                            
class JsonFieldUpdateSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField()
    context = serializers.JSONField()

    class Meta:
        model = JsonFieldObject
        fields = ('id', 'context')
        
    def validate(self, data):
        """ for trace """
        print(data["context"])
        return data

我尝试发送包含下一个数据的放置请求:

{
    "id":1,
    "context": {
        "floor_field": 27,
        "square2": 222,
        "oneAs": "Hello"
    }
}

在序列化程序中,我期望这样:

{'id': 1, 'context': {'floor_field': 27, 'square2': 222, 'oneAs': 'Hello'}}

但得到了:

{'id': 1, 'context': {'floor_field': 27, 'square_2': 222, 'one_As': 'Hello'}}

如何禁用此行为?

DRF 根据 Python PEP8 风格指南完成这项工作。

您可以使用第三方工具禁用它。您似乎在期待 camelCase。所以要获得 camelCase 响应,请使用 djangorestframework-camel-case:

安装它pip install djangorestframework-camel-case

像这样更新您的 DRF 设置:

REST_FRAMEWORK = {
    # ...
    'JSON_UNDERSCOREIZE': {
        'no_underscore_before_number': True,
    },
    # ...
}

如果你想要更高级的配置,你可以按照这个: # ... REST_FRAMEWORK = {

    'DEFAULT_RENDERER_CLASSES': (
        'djangorestframework_camel_case.render.CamelCaseJSONRenderer',
        'djangorestframework_camel_case.render.CamelCaseBrowsableAPIRenderer',
        # Any other renders
    ),

    'DEFAULT_PARSER_CLASSES': (
        # If you use MultiPartFormParser or FormParser, we also have a camel case version
        'djangorestframework_camel_case.parser.CamelCaseFormParser',
        'djangorestframework_camel_case.parser.CamelCaseMultiPartParser',
        'djangorestframework_camel_case.parser.CamelCaseJSONParser',
        # Any other parsers
    ),
}
# ...

可以在此处找到更多详细信息:https://github.com/vbabiy/djangorestframework-camel-case