Django Rest Framework中的嵌套验证 [英] Nested validation in 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.
有几种方法可以做到:
- You can write your own custom field type (it's nice if you are planning to do something similar in other serializers);
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屋!