【问题标题】:Why drf add underlines to serialized dictfield?为什么 drf 在序列化的 dictfield 中添加下划线?
【发布时间】:2021-10-02 16:12:08
【问题描述】:

我使用 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

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

{
    "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'}}

如何禁用此行为?

【问题讨论】:

    标签: django serialization django-rest-framework django-serializer


    【解决方案1】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-28
      • 2017-12-23
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 2014-02-01
      相关资源
      最近更新 更多