Django Rest: 직렬 변환기에서 예약어를 필드로 사용

최근에 우리는 and , in , class 등과 같은 일부 절이 있는 요청 페이로드를 직렬화해야 하는 직장에서 문제를 발견했습니다.

직렬화해야 하는 다음 요청 페이로드를 고려하십시오.

{
    "values": [ "21234" ],
    "and": true,
    "count": 200,
    "year": 2020
}


Django-RestSerializer 클래스는 필드를 동적으로 수정할 수 있는 메서드get_fields를 제공합니다. 따라서 이 방법을 사용하여 다음과 같이 필드를 수정할 수 있습니다.

from rest_framework import serializers

class DemoSerializer(serializers.Serializer):
    values = serializers.ListField(child=serializers.CharField(), allow_empty=True)
    and_ = serializers.BooleanField() # avoid naming conflicts
    count = serializers.IntegerField()
    year = serializers.IntegerField()

    def get_fields(self):
        fields = super().get_fields()
        and_ = fields.pop('and_') # Dynamically modify field
        fields['and'] = and_
        return fields


이제 DemoSerializer를 사용하여 payload를 직렬화할 수 있습니다.

import json
from rest_framework.exceptions import ValidationError

payload = """
{
    "values": [ "21234" ],
    "and": true,
    "count": 200,
    "year": 2020
}
"""
serializer = DemoSerializer(data=json.loads(payload))
try:
    serializer.is_valid(raise_exception=True) # Perform validation
except ValidationError as error:
    print(error)
else:
    validated_data = serializer.validated_data 
    print(validated_data)


산출:

OrderedDict([('values', ['21234']), ('count', 200), ('year', 2020), ('and', True)])


도움이 되길 바랍니다 😊

좋은 웹페이지 즐겨찾기