2

Это мой serializers.py (я хочу создать сериалайзер для встроенной модели пользователя):DjangoRestFramework ModelSerializer: проверка на местном уровне не работает

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). Заметьте, если это имеет значение или нет.

+0

Получается ли оно вызвано надлежащим образом с не буквенно-цифровыми символами? – jvc26

+0

@ jvc26 Нет. Он выдает сообщение об ошибке {'username': [u'Введите действительное имя пользователя. Это значение может содержать только буквы, цифры и символы @ /./+/-/_.]] Большая проблема, которую я вижу здесь, заключается в том, что даже когда я меняю функцию validate_username на "def validate_username (self, username): raise serializers.ValidationError ('Тестирование, чтобы увидеть, если возникла ошибка.') ", ошибка даже не поднимается, поэтому кажется, что Django игнорирует мою функцию validate_username (или она просто не переходит к интерфейсу поднятая ошибка, которая возникает из моей функции validate_username). – user2719875

+0

@ jvc26 Я отредактировал мое сообщение и отметил, что я использую ModelSerializer (а не сериализатор). Не уверен, что это имеет значение или нет. – user2719875

ответ

2

Проверка на уровне поля вызывается перед проверкой уровня сериализации.

Таким образом, модель User, имеющая имя пользователя unique=True, проверит на уровне поля исключение из-за того, что имя пользователя уже присутствует. DRF's UniqueValidator делает эту работу по сбору исключения, когда поле не уникально.

В соответствии с ФПИ исходного кода,

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 никогда не вызывается.

Смежные вопросы