【问题标题】:Django REST - Run field validation from within custom to_internal_value for serializerDjango REST - 从自定义 to_internal_value 中为序列化程序运行字段验证
【发布时间】:2017-03-10 17:30:26
【问题描述】:

我正在尝试像这样序列化 JSON:

{
    "Some URL": "https://helloworld.com/",
    "Some Integer": 12
    "Some Dictionary": {
        "Nested Array": [...]
        "Nested Dictionary": {...}
    }
}

不允许使用带有空格的字段编写序列化程序(当然是因为 Python 变量),所以我正在尝试继承 BaseSerializer。

class MyNestedSerializer(serializers.BaseSerializer):

    def to_internal_value(self, data):
        nested_array = data.get('Nested Array')
        nested_dictionary = data.get('Nested Dictionary')

        # Validation
        ....
        ....

        return {
            'Nested Array': nested_array,
            'Nested Dictionary': nested_dictionary
        }

    def to_representation(self, instance):
        return {
            'Nested Array': instance['Nested Array'],
            'Nested Dictionary': instance['Nested Dictionary']
        }


class MySerializer(serializers.BaseSerializer):

    def to_internal_value(self, data):
        some_url = data.get('Some URL')
        some_integer = data.get('Some Integer')
        some_dictionary = data.get('Some Dictionary')

        # Validation
        ....
        nested_serializer = MyNestedSerializer(data=some_dictionary)
        nested_serializer.is_valid(raise_exception=True)
        ....

        return {
            'Some URL': some_url,
            'Some Integer': some_integer,
            'Some Dictionary': some_dictionary
        }

    def to_representation(self, instance):
        return {
            'Some URL': instance['Some URL']
            'Some Integer': instance['Some Integer']
            'Some Dictionary': instance['Some Dictionary']
        }

现在通常,我会像这样在序列化器(不是 BaseSerializer)中定义字段类型:

class BasicSerializer(serializers.Serializer):
    some_integer = serializers.IntegerField(min_value=0)
    some_dictionary = serializers.DictField(child=serializers.CharField())

并且会进行字段验证。我想要的是让这些验证器在我的to_internal_value 实现中运行,而不是编写我自己的验证。重写已经编写的内容没有意义,但我似乎无法弄清楚如何在我的 BaseSerializer 中运行基本验证。

【问题讨论】:

  • 抱歉延迟回复,我想我没有收到电子邮件通知?无论如何,您的回答帮助我实现了我想要的。我接受了。
  • 很高兴能帮上忙。

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


【解决方案1】:

序列化器类是subclass of BaseSerializer。所以在这种情况下,你真的不需要从 BaseSerializer 派生,你可以使用 Serializer 来代替。

class MySerializer(serializers.Serializer):


    def to_internal_value(self, data):
        some_url = data.get('Some URL')
        some_integer = data.get('Some Integer')
        some_dictionary = data.get('Some Dictionary')

        # Validation
        ....
        nested_serializer = MyNestedSerializer(data=some_dictionary)
        nested_serializer.is_valid(raise_exception=True)
        ....

        return {
            'Some URL': some_url,
            'Some Integer': some_integer,
            'Some Dictionary': some_dictionary
        }

    def to_representation(self, instance):
        return {
            'Some URL': instance['Some URL']
            'Some Integer': instance['Some Integer']
            'Some Dictionary': instance['Some Dictionary']
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多