如何使用Django Rest Framework使用序列化程序来验证动态JSON?

阿莫·塔尔帕利卡(Amogh Talpallikar)

我有一个接受JSON的API。JSON数据具有一个称为的键type该键应该是一个选择字段,并且具有5种指定类型之间的值。说出A,B,C,D和E。

JSON可以具有不同的字段,具体取决于值是A,B,C,D还是E。如何验证可能存在或不存在的其他字段?

凯文·布朗

这个问题有两个部分:

  • 如何验证多个字段?
  • 如何仅验证某些输入的字段子集?

我将分别回答这两个问题。

如何验证多个字段?

Django REST Framework允许您通过覆盖validate序列化程序上的方法来验证多个字段在所有其他验证器都运行之后,最后完成此操作,并且文档中对此进行详细说明

def validate(self, attrs):
    if "type" in attrs:
        the_type = attrs["type"]

        if the_type == "A":
            # Check if "a_field" was actually passed
            if "a_field" not in attrs:
                raise ValidationError({"a_field": self.error_messages["required"]})

            # Check that it's "great"
            if attrs["a_field"] != "great":
                raise Va    class DemoSerializer(serializers.Serializer):
    type = serializers.ChoiceField(choices=types)
    a_field = serializers.CharField(required=False)

    def to_representation(self, instance):
        optional_fields = {
            "B": ["a_field"],
        }

        data = super(DemoSerializer, self).to_representation(instance)

        instance_type = data["type"]

        if instance_type in optional_fields:
            remove_fields = optional_fields[instance_type]

            for field in remove_fields:
                if field in data:
                    data.pop(field)

        return datalidationError({"a_field": self.error_messages["not_great"]})

    return attrs

这只会验证a_field是否type"A"

如何仅验证某些输入的字段子集?

这是棘手的部分,因为默认情况下,Django REST Framework不会通过序列号中没有密钥的序列化器传递数据fields因此,如果在我们的示例中,您没有添加a_field到列表中,则即使传入了数据,也总是会触发一个错误,要求您输入该字段。这意味着您需要将所有可选字段添加到您的列表中序列化器并将其标记为required=False

class DemoSerializer(serializers.Serializer):
    type = serializers.ChoiceField(choices=types)
    a_field = serializers.CharField(required=False)

不幸的是,使用序列化程序对数据进行序列化时,所有这些可选字段都显示出来,这是一个不幸的副作用,但是您可以通过重写来解决此问题to_representation您将需要提前知道要删除哪些字段。

class DemoSerializer(serializers.Serializer):
    type = serializers.ChoiceField(choices=types)
    a_field = serializers.CharField(required=False)

    def to_representation(self, instance):
        optional_fields = {
            "B": ["a_field"],
        }

        data = super(DemoSerializer, self).to_representation(instance)

        instance_type = data["type"]

        if instance_type in optional_fields:
            remove_fields = optional_fields[instance_type]

            for field in remove_fields:
                if field in data:
                    data.pop(field)

        return data

这应该允许您根据返回的类型删除字段列表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django Rest Framework使用动态字段序列化

来自分类Dev

Django REST Framework 序列化程序验证错误

来自分类Dev

如何使用Django Rest Framework序列化器构建JSON响应?

来自分类Dev

如何在Django Rest Framework嵌套序列化程序中动态更改深度?

来自分类Dev

Django REST Framework中序列化程序验证的顺序

来自分类Dev

Django Rest Framework:更改序列化程序或基于身份验证添加字段

来自分类Dev

Django Rest Framework-序列化程序中的字段级别验证

来自分类Dev

验证唯一的电子邮件Django Rest Framework序列化程序

来自分类Dev

Django Rest Framework-序列化程序中的字段级别验证

来自分类Dev

如何在SerializerMethodField()中使用多个查询集优化Django-rest-framework序列化程序

来自分类Dev

如何在 Django Rest Framework 中使用序列化程序检索具有嵌套关系的模型数据?

来自分类Dev

Django Rest Framework与序列化程序结合使用时发生AttributeError

来自分类Dev

在Django Rest Framework 3中使用可写的嵌套序列化程序创建多个对象

来自分类Dev

我应何时在Django Rest Framework序列化程序中使用ParseError与ValidationError?

来自分类Dev

使用Django Rest Framework和默认用户卡住了嵌套的序列化程序

来自分类Dev

使用Django Rest Framework序列化程序更新现有模型

来自分类Dev

使用Django Rest Framework序列化程序发布到嵌套字段

来自分类Dev

Django Rest Framework实例化序列化程序错误

来自分类Dev

如何使用Django rest框架反序列化Foreignkey?

来自分类Dev

Django Rest Framework序列化程序和Django表单

来自分类Dev

Django Rest Framework嵌套的序列化程序部分更新

来自分类Dev

Django Rest Framework更新嵌套序列化程序

来自分类Dev

Django Rest Framework序列化程序中的循环依赖

来自分类Dev

在Django Rest Framework中将HyperlinkedField用于序列化程序

来自分类Dev

Django Rest Framework 中用户特定的序列化程序

来自分类Dev

如何使用Django Rest Framework反序列化嵌套对象

来自分类Dev

如何使用Rest Framework在Django中序列化关系OneToOne?

来自分类Dev

如何使用Django Rest Framework将url字段添加到序列化器

来自分类Dev

如何使用 Django Rest Framework 序列化字符串列表

Related 相关文章

  1. 1

    Django Rest Framework使用动态字段序列化

  2. 2

    Django REST Framework 序列化程序验证错误

  3. 3

    如何使用Django Rest Framework序列化器构建JSON响应?

  4. 4

    如何在Django Rest Framework嵌套序列化程序中动态更改深度?

  5. 5

    Django REST Framework中序列化程序验证的顺序

  6. 6

    Django Rest Framework:更改序列化程序或基于身份验证添加字段

  7. 7

    Django Rest Framework-序列化程序中的字段级别验证

  8. 8

    验证唯一的电子邮件Django Rest Framework序列化程序

  9. 9

    Django Rest Framework-序列化程序中的字段级别验证

  10. 10

    如何在SerializerMethodField()中使用多个查询集优化Django-rest-framework序列化程序

  11. 11

    如何在 Django Rest Framework 中使用序列化程序检索具有嵌套关系的模型数据?

  12. 12

    Django Rest Framework与序列化程序结合使用时发生AttributeError

  13. 13

    在Django Rest Framework 3中使用可写的嵌套序列化程序创建多个对象

  14. 14

    我应何时在Django Rest Framework序列化程序中使用ParseError与ValidationError?

  15. 15

    使用Django Rest Framework和默认用户卡住了嵌套的序列化程序

  16. 16

    使用Django Rest Framework序列化程序更新现有模型

  17. 17

    使用Django Rest Framework序列化程序发布到嵌套字段

  18. 18

    Django Rest Framework实例化序列化程序错误

  19. 19

    如何使用Django rest框架反序列化Foreignkey?

  20. 20

    Django Rest Framework序列化程序和Django表单

  21. 21

    Django Rest Framework嵌套的序列化程序部分更新

  22. 22

    Django Rest Framework更新嵌套序列化程序

  23. 23

    Django Rest Framework序列化程序中的循环依赖

  24. 24

    在Django Rest Framework中将HyperlinkedField用于序列化程序

  25. 25

    Django Rest Framework 中用户特定的序列化程序

  26. 26

    如何使用Django Rest Framework反序列化嵌套对象

  27. 27

    如何使用Rest Framework在Django中序列化关系OneToOne?

  28. 28

    如何使用Django Rest Framework将url字段添加到序列化器

  29. 29

    如何使用 Django Rest Framework 序列化字符串列表

热门标签

归档