如何在Django Rest Framework序列化程序中覆盖验证?

时间:2019-11-09 13:45:14

标签: python django validation serialization django-rest-framework

在Django Rest Framework中,我有一个序列化器。我收到一些数据,其中一个名为categories的数据是一个字符串数组:

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

我想将数组序列化为逗号分隔的字符串("ADC,HJD,RTP"),以便可以将其放入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 :(得分:0)

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_方法名称。