2

Я в настоящее время создание API, основанный на DRF.I есть модель, которая, как:Как написать поле Custom Validation для ModelSerializers в Django Rest Framework (DRF), подобное проверке формы в Django?

class Task(models.Model): 
    name = models.CharField(max_length = 255) 
    completed = models.BooleanField(default = False) 
    description = models.TextField() 
    text = models.TextField(blank = False, default = "this is my text") 

    def __unicode__(self): 
     return self.name 

и соответствующий Serializer для этой модели, как:

class TaskSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Task 
     fields = ('name','description','completed','text') 

Теперь мой вопрос заключается в том, что я хотите проверить поле «имя» моей модели при обработке данных. Например, я могу закончить проверку имени или второе имя пользователя с помощью кода Python похожего на Форму Джанго:

def clean_name(self): 
    name = form.cleaned_data.get('name') 
    first,second = name.split(' ') 
    if second is None: 
     raise forms.ValidationError("Please enter full name") 

Я знаю, что называется «validate_ (имя_поль)» в классе Serializers.serializer. Но я хочу, чтобы это использовать в Serializers.ModelSerializer вместо. (Просто аналогичен проверки пользовательских форм в Django)

ответ

7

Вы можете добавить метод validate_name() к вашему сериализатору, который будет выполнять эту проверку. Он должен вернуть проверенное значение или поднять ValidationError.

Для того, чтобы проверить, введено ли пользователем полное имя или нет, мы будем использовать str.split(), который вернет все слова в строке. Если нет. слов в строке не больше 1, чем мы поднимем ValidationError. В противном случае мы возвращаем value.

class TaskSerializer(serializers.ModelSerializer): 

    def validate_name(self, value): 
     """ 
     Check that value is a valid name. 
     """ 
     if not len(value.split()) > 1: # check name has more than 1 word 
      raise serializers.ValidationError("Please enter full name") # raise ValidationError 
     return value 
+0

Есть ли что-то похожее на cleaned_data в сериализаторах? –

+0

Да, существует 'serializer.validated_data', который доступен после вызова' .is_valid() 'в сериализаторе. –

+0

Спасибо. Оно работает. –