Django Rest框架会自动处理哪些类型的验证?

Django Rest框架会自动处理哪些类型的验证?,django,django-rest-framework,django-serializer,Django,Django Rest Framework,Django Serializer,假设我有一个定义如下的模型: from django.core.validators import MinValueValidator, MaxValueValidator, RegexValidator alphanumeric_validator = RegexValidator(r'^[a-zA-Z0-9]*$', 'Only alphanumeric characters are allowed.') class Person(model.Model): name = mod

假设我有一个定义如下的模型:

from django.core.validators import MinValueValidator, MaxValueValidator, RegexValidator

alphanumeric_validator = RegexValidator(r'^[a-zA-Z0-9]*$', 'Only alphanumeric characters are allowed.')

class Person(model.Model):
    name = models.CharField(max_length=60, validators=[alphanumeric_validator])
    number = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(100)])
    email = models.EmailField()
现在,假设我正在使用Django Rest框架序列化和创建Person对象。它看起来像这样:

from rest_framework import serializers
from .models import Person
from rest_framework.response import Response

class PersonSerializer(serializers.ModelSerializer):
    class Meta:
        model = Person
        fields = ('name', 'number', 'email')

class PostPerson(APIView):
    def post(self, request, format=None):
        serializer = PersonSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()=
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
现在,我的问题是:当我使用
is\u valid()
验证序列化程序时,DRF是否处理
验证器=[字母数字验证器]
,以及
验证器=[MinValueValidator(0),MaxValueValidator(100)]
?此外,我确信DRF会自动处理
max_length
属性,但它是否也会使用适当的正则表达式检查
电子邮件是否为实际电子邮件地址

我通常只是对clean、full_clean以及表单验证和序列化程序验证期间调用的所有方法感到困惑,因此希望得到一些可靠的解释


提前感谢。

Django rest框架验证的行为类似于Django
ModelForm
验证;它从模型字段中获取参数并进行相应的验证

例如,我们将使用一个简单的模型&serializer类,它有一个具有唯一性约束的字段

class CustomerReportRecord(models.Model):
    time_raised = models.DateTimeField(default=timezone.now, editable=False)
    reference = models.CharField(unique=True, max_length=20)


class CustomerReportSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomerReportRecord
当我们打开Django shell时,我们可以看到验证器已经应用于序列化程序(注意
max_length
验证器
列表)

我们可以在这里看到,序列化程序调用
字段。运行\u validation
方法,该方法使用模型字段验证器,如果验证失败,它们将引发
djangovalidateError
。如果成功,它将继续运行现有的任何其他验证器,例如序列化程序字段特定验证器(
.validate\uu

请阅读更多关于验证的信息以及它在Django&DRF中的工作原理:

  • 希望这有助于理解验证在DRF中是如何工作的,哪怕只是一点点

    编辑:只要您存储电子邮件的字段在您的模型中定义为
    EmailField
    ,DRF就会验证电子邮件。更多关于这方面的信息可以找到

    >>> from project.example.serializers import CustomerReportSerializer
    >>> serializer = CustomerReportSerializer()
    >>> print(repr(serializer))
    CustomerReportSerializer():
        id = IntegerField(label='ID', read_only=True)
        time_raised = DateTimeField(read_only=True)
        reference = CharField(max_length=20, validators=[<UniqueValidator(queryset=CustomerReportRecord.objects.all())>])
    
    def to_internal_value(self, data):
        """
        Dict of native values <- Dict of primitive datatypes.
        """
        if not isinstance(data, dict):
            message = self.error_messages['invalid'].format(
                datatype=type(data).__name__
            )
            raise ValidationError({
                api_settings.NON_FIELD_ERRORS_KEY: [message]
            })
    
        ret = OrderedDict()
        errors = OrderedDict()
        fields = self._writable_fields
    
        for field in fields:
            validate_method = getattr(self, 'validate_' + field.field_name, None)
            primitive_value = field.get_value(data)
            try:
                validated_value = field.run_validation(primitive_value)
                if validate_method is not None:
                    validated_value = validate_method(validated_value)
            except ValidationError as exc:
                errors[field.field_name] = exc.detail
            except DjangoValidationError as exc:
                errors[field.field_name] = list(exc.messages)
            except SkipField:
                pass
            else:
                set_value(ret, field.source_attrs, validated_value)
    
        if errors:
            raise ValidationError(errors)
    
        return ret