Django Rest Framework中的嵌套验证 [英] Nested validation in Django Rest Framework

查看:51
本文介绍了Django Rest Framework中的嵌套验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Using django rest framework I want to validate fields.

正确的输入请求:

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

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

My serializers.py (I don't have any associated models and the models.py itself):

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 字段):

Wrong input request (which should state that int field is required) :

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

现在 test_field_a test_field_b 已根据要求进行了验证.但是,如何在请求的不同级别上验证字段呢?(在这种情况下为 test_field_c )

Now test_field_a and test_field_b are validated as required. But how to make validation of fields on different levels of the request? (in this case test_field_c)

推荐答案

JSONField仅检查字段是否包含正确的JSON结构.您需要执行此操作,并检查此JSON中的值.

JSONField just checks that a field contains correct JSON structure. You need to do it plus check values from this JSON.

有几种方法可以做到:

  1. 您可以编写自己的自定义字段类型(如果您打算在其他序列化程序中执行类似的操作,那将是很好的选择);
  2. 您可以更改字段验证(尝试类似的方法):

  1. You can write your own custom field type (it's nice if you are planning to do something similar in other serializers);
  2. You can change field validation (try something like this):

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

  • 您可以尝试嵌套验证:

    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)
    

  • 这篇关于Django Rest Framework中的嵌套验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆