gpt4 book ai didi

DjangoRestFramework ModelSerializer : field-level validation is not working

转载 作者:行者123 更新时间:2023-12-04 19:58:42 27 4
gpt4 key购买 nike

这是我的 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', )

def validate_username(self, username):
if not re.search(r'^\w+$', username): #checks if all the characters in username are in the regex. If they aren't, it returns None
raise serializers.ValidationError('Username can only contain alphanumeric characters and the underscore.')
try:
User.objects.get(username=username)
except ObjectDoesNotExist:
return username
raise serializers.ValidationError('Username is already taken.')

问题是,当我尝试使用已经存在的用户名创建用户时,它返回以下字典:
{'username': [u'This field must be unique.']}

而不是说
{'username': [u'Username is already taken']}

我为此重新创建了 validate_username 函数(用于测试目的):
    def validate_username(self, username):
raise serializers.ValidationError('Testing to see if an error is raised.')

它不会引发错误。知道为什么 DjangoRestFramework 会忽略 validate_username 函数吗?

编辑:请注意,我使用的是 ModelSerializer(在此处的教程中: http://www.django-rest-framework.org/api-guide/serializers/#validation 它只讨论了 Serializer 的字段级验证,而不是 ModelSerializer)。请注意它是否有所作为。

最佳答案

在序列化程序级验证之前调用字段级验证。

所以型号User用户名为 unique=True ,由于用户名已经存在,字段级验证将引发异常。 DRF UniqueValidator当字段不唯一时,会执行此引发异常的工作。

根据 DRF 源代码,

class UniqueValidator:
"""
Validator that corresponds to `unique=True` on a model field.

Should be applied to an individual field on the serializer.
"""
message = _('This field must be unique.')

由于这些验证器在序列化器级验证之前运行,您的 validate_username永远不会被调用。

关于DjangoRestFramework ModelSerializer : field-level validation is not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30542249/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com