Как переписать валидацию в Django Rest Framework Serializer? - PullRequest
1 голос
/ 09 ноября 2019

В Django Rest Framework у меня есть Сериализатор. Я получаю некоторые данные, из которых categories представляет собой массив строк:

{
    "name": "John",
    "age": 25,
    "categories": ["ADC", "HJD", "RTP"]
}

Я хочу сериализовать массив в строку через запятую ("ADC,HJD,RTP"), чтобы я мог поместить ее вa CharField.

Итак, я создал метод validate_categories() в своем сериализаторе следующим образом:

class DeviceSerializer(HALSerializer):
    # here some other stuff
    categories = serializers.SerializerMethodField()

    class Meta:
        model = Device
        fields = (
            '_links',
            'id',
            'name',
            'age',
            'categories',
        )

    def get_categories(self, obj):
        if obj.categories is None:
            return []
        return [
            obj.categories.choices[key.upper()]
            for key in obj.categories
        ]

    def validate_categories(self, categories):
        print("IN THE VALIDATOR")  # WE NEVER REACH THIS POINT
        print(categories)
        return categories

    def create(self, validated_data):
        # here some custom creation code
        device = Device.objects.create(**validated_data)
        return device

Когда я публикую JSON-объект, объект создается, но никогда не вызывается валидатор.

Кто-нибудь знает, что я здесь не так делаю?

1 Ответ

0 голосов
/ 09 ноября 2019

serializers.SerializerMethodField() - это поле только для чтения, поэтому оно не будет использоваться для десериализации.

Вы можете добавить новое поле write_only, которое будет использоваться только для десериализации, например, categories_list:

class DeviceSerializer(HALSerializer):
    categories = serializers.SerializerMethodField()
    categories_list = serializers.ListField(child=serializers.CharField(), write_only=True)

Переключите имена полей, если у вас нет контроля над вводом. И добавьте categories_list к DeviceSerializer.Meta.fields и соответственно измените имя метода validate_ для поля десериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...