Search code examples
djangoserializationdjango-rest-frameworkdjango-serializer

Why drf add underlines to serialized dictfield?


I use djangorestframework==3.9.4, I can't realize why drf changes serialized data (add underlines to field names before numbers and uppercase)

# 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

I try send put request, that contains next data:

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

in serializer I expected this:

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

but got:

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

how can I disable this behavior?


Solution

  • DRF does this jobs based on Python PEP8 style guide.

    You can disable it with third-party tools. It seems you are expecting camelCase. so to get camelCase response, use djangorestframework-camel-case:

    install it pip install djangorestframework-camel-case

    Update your DRF setting like this:

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

    If you want more advance configuration, you can follow this: # ... 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
        ),
    }
    # ...
    

    More details can be found here: https://github.com/vbabiy/djangorestframework-camel-case