相关疑难解决方法(0)

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

情况

在Django REST框架中使用验证时ModelSerializer,我注意到这些Meta.model字段总是经过验证,即使这样做不一定有意义.以下示例为User模型的序列化:

  1. 我有一个创建用户的端点.因此,有一个password领域和一个confirm_password领域.如果两个字段不匹配,则无法创建用户.同样,如果请求username已存在,则无法创建用户.
  2. 用户为上述每个字段POST不正确的值
  3. 的实现validate在串行的情况下(见下文),捕不匹配passwordconfirm_password领域

执行validate:

def validate(self, data):
    if data['password'] != data.pop('confirm_password'):
        raise serializers.ValidationError("Passwords do not match")
    return data
Run Code Online (Sandbox Code Playgroud)

问题

即使ValidationError被引发validate,ModelSerializer仍然会查询数据库以检查它username是否已被使用.这在从端点返回的错误列表中很明显; 存在模型和非字段错误.

因此,我想知道如何在非字段验证完成之前阻止模型验证,从而节省了对数据库的调用.

尝试解决方案

我一直试图通过DRF的来源找出这种情况发生的地方,但是我找不到我需要覆盖的内容以使其工作失败.

python django validation django-rest-framework

26
推荐指数
2
解决办法
1万
查看次数

Django Rest Framework - 如何为所有ModelSerializer字段创建自定义错误消息?

这是我的serializers.py(我想为内置的User模型创建一个序列化器):

from rest_framework import serializers

from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('username', 'password', 'email', )
Run Code Online (Sandbox Code Playgroud)

我知道Django Rest Framework有它自己的字段验证器,因为当我尝试使用已经存在的用户名创建用户时,它会引发一个错误:

{'username': [u'This field must be unique.']}
Run Code Online (Sandbox Code Playgroud)

我想自定义错误消息并让它说"此用户名已被占用.请再试一次"而不是说"此字段必须是唯一的".

它还有一个内置的正则表达式验证器,因为当我创建带有感叹号的用户名时,它会说:

{'username': [u'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.']}
Run Code Online (Sandbox Code Playgroud)

我想自定义正则表达式验证器,以便它只是说"无效的用户名".

如何自定义每个字段的所有错误消息?

注意:根据这篇文章:Django Rest Framework序列化程序中的自定义错误消息我可以这样做:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User

    def __init__(self, *args, **kwargs):
        super(UserSerializer, self).__init__(*args, **kwargs)

        self.fields['username'].error_messages['required'] = u'My custom required msg'
Run Code Online (Sandbox Code Playgroud)

但是我如何为"独特"和"正则表达式"验证器做些什么呢?我试过了

self.fields['username'].error_messages['regex'] = u'My custom …
Run Code Online (Sandbox Code Playgroud)

django validation error-handling django-serializer django-rest-framework

7
推荐指数
1
解决办法
2630
查看次数