Проверка полей в конечной точке REST - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть конечная точка, которая при вызове должна либо обновить, либо создать профиль пользователя.Внутри этой конечной точки находятся 3 поля, которые необходимо создать или обновить (avatar, bio, gender) В настоящее время я работаю с UpdateAPIView, например, так:

class UpdateOrCreateProfile(UpdateAPIView):
    serializer_class = ProfileSerializer

    def get_object(self):
        return Profile.objects.get(user=self.request.user) 

Класс сериализатора выглядит следующим образом:

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = '__all__'

Это хорошо работает, однако проверка работает неправильно.Отображаемая форма имеет функцию clean_avatar, которая не принимает изображения размером менее 200x200 пикселей.Вот так:

class ProfileForm(ModelForm):
    avatar = forms.ImageField(required=False, widget=forms.FileInput)
    bio = forms.CharField(widget=forms.Textarea(attrs={'rows': 3, "placeholder": "Bio"}), max_length=200,
                          required=False)
    class Meta:
        model = Profile
        fields = ['avatar', 'bio', 'gender']

    def clean_avatar(self):
        picture = self.cleaned_data.get("avatar")
        if picture:
            w, h = get_image_dimensions(picture)
            if w < 200:
                raise forms.ValidationError("The image is %i pixel wide. It's supposed to be more than 200px" % w)
            if h < 200:
                raise forms.ValidationError("The image is %i pixel high. It's supposed to be 200px" % h)
        return picture

Как я могу сделать так, чтобы такая же проверка, которая происходит в форме, также происходила в моей конечной точке?

1 Ответ

0 голосов
/ 04 февраля 2019

Вы можете написать метод validate_avtar. Он работает как метод очистки формы.

class ProfileSerializer(serializers.ModelSerializer):
   class Meta:
      model = Profile
      fields = '__all__'

   def validate_avatar(self, picture):
     if picture:
        w, h = get_image_dimensions(picture)
        if w < 200:
            raise serializers.ValidationError("The image is %i pixel wide. It's supposed to be more than 200px" % w)
        if h < 200:
            raise serializers.ValidationError("The image is %i pixel high. It's supposed to be 200px" % h)
     return picture
...