【问题标题】:Nested validation in Django Rest FrameworkDjango Rest Framework 中的嵌套验证
【发布时间】:2018-12-06 12:10:02
【问题描述】:

使用 django rest 框架我想验证字段。

正确的输入请求:

{
   test_field_a: {test_field_c: 25}, 
   test_field_b: {}
}

我的 serializers.py(我没有任何关联的模型和 models.py 本身):

from rest_framework import serializers
class TestSerializer(serializers.Serializer):
  test_field_a = serializers.JSONField(label='test_field_a', allow_null=False, required=True)
  test_field_b = serializers.JSONField(label='test_field_b', required=True)
  test_field_c = serializers.IntegerField(label='test_field_c)

错误的输入请求(应该说明int字段是必需的):

{
   test_field_a: {test_field_c: 'wrong'}, 
   test_field_b: {}
} 

现在 test_field_atest_field_b 已根据需要进行验证。但是如何对请求的不同级别的字段进行验证呢? (在这种情况下test_field_c

【问题讨论】:

    标签: python django validation django-rest-framework


    【解决方案1】:

    JSONField 只是检查一个字段是否包含正确的 JSON 结构。您需要执行此操作并检查此 JSON 中的值。

    有几种方法可以做到:

    1. 您可以编写自己的custom field type(如果您打算在其他序列化程序中做类似的事情,那就太好了);
    2. 你可以更改field validation(试试这样的):

      from rest_framework import serializers
      
      class TestSerializer(serializers.Serializer)::
          test_field_a = serializers.JSONField(label='test_field_a', allow_null=False, required=True)
          test_field_b = serializers.JSONField(label='test_field_b', required=True)
      
          def validate_test_field_a(self, value):
              """
              Check that test_field_a .
              """
              if not isinstance(value.get('test_field_c'), int):
                 raise serializers.ValidationError("Some error message")
             return value
      
    3. 你可以试试nested validation:

      from rest_framework import serializers
      
      
      class Test1Serializer(serializers.Serializer):
          test_field_c = serializers.IntegerField(label='test_field_c')
      
      
      class TestSerializer(serializers.Serializer):
          test_field_a = Test1Serializer()
          test_field_b = serializers.JSONField(label='test_field_b', required=True)
      

    【讨论】:

    • 谢谢! 3.有没有办法额外检查test_field_a是否是json类型?
    • @trthhrtz 检查它是否属于dict
    • @trthhrtz 如果您只想使用 JSON,您可以在 parser_classes 属性或项目设置中指定它。那么 test_field_a 唯一可能的结构类型将是 JSON。 django-rest-framework.org/api-guide/parsers/…
    • @AlexK。实际上解析器类只要求请求有效负载为 json 格式。没有什么可以阻止您将整数、字符串和其他类型添加到 json 中,因此添加该解析器并不意味着即使是嵌套字段也将全部是 json,因为 json iteslf 是由其他主要类型组成的。如果在不指定错误字段的情况下无法解析有效负载,它将再次抛出错误。不确定这里需要什么
    • @AlexK。我们可能没有正确理解对方。他的问题是如何检查test_field_a 是json 类型,而您建议将解析器类设置为json。如果 `test_field_a' 只是一个字符字段,解析器仍然可以完美解析 TypeSerializer 而不会出现任何问题,从而无法验证它是 json。
    【解决方案2】:

    序列化程序的 JSONField 没有对嵌套字段的验证,因为它并不意味着嵌套显式声明的字段,据我所知,目前没有办法指定 json 模式来验证它。 您可以通过声明validate_test_field_a 验证方法自己验证该字段。

    例如:

        def validate_test_field_a(self, value):
            if 'test_field_c' not in value:
                raise serializers.ValidationError('`test_field_c` is required')
            return value
    

    一般来说,如果您发现自己需要验证 JSONField 中的嵌套类型,则表明架构不好,您应该考虑使用嵌套序列化程序。同样适用于在模型中使用 JSONField

    【讨论】:

      猜你喜欢
      • 2018-07-06
      • 2015-09-22
      • 2016-11-21
      • 2014-12-15
      • 2015-12-16
      • 2018-07-07
      • 1970-01-01
      • 2023-01-08
      • 2021-09-22
      相关资源
      最近更新 更多