【问题标题】:How to overwrite validation in Django Rest Framework Serializer?如何覆盖 Django Rest Framework Serializer 中的验证?
【发布时间】:2020-03-05 20:55:55
【问题描述】:

在 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 时,对象被创建,但验证器永远不会被调用。

有人知道我在这里做错了什么吗?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。我还没有测试你的建议,但我已经有一个问题了; serializers 中没有一个可以读写的字段吗?这样我就不需要使用两个不同的字段。
    • @kramer65 大多数字段都是。如果你想要一个单一的字段,你需要一个嵌套的序列化器或类似*RelatedField 的东西(基于你的例子StringRelatedField 似乎合适),但是我们需要查看你的模型定义,以及你的计划的详细想法。
    猜你喜欢
    • 2018-08-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 2018-10-05
    相关资源
    最近更新 更多