为什么 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
我用的是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