Как загрузить изображение через Django Rest Framework?

Вот моя моя модель содержащая ImageField:

class Profile(models.Model):
    user = models.OneToOneField(User)

    new_article_notifications_enabled = models.BooleanField(default=False)
    new_comment_notifications_enabled = models.BooleanField(default=False)
    new_comment_answer_notifications_enabled = models.BooleanField(default=False)

    userpic = models.ImageField(upload_to='userpics/', blank=True, null=True)
    city = models.PositiveSmallIntegerField(choices=CITY_CHOICES, default=CITY_CHOICES[0][0])
    webpage = models.URLField(blank=True)
    about_me = models.TextField(blank=True)
    favorite_brands = models.TextField(blank=True)

Serializer:

class ProfileChangeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = [
            'new_article_notifications_enabled',
            'new_comment_notifications_enabled',
            'new_comment_answer_notifications_enabled',
            'userpic',
            'city',
            'webpage',
            'about_me',
            'favorite_brands',
        ]

    def update(self, instance, validated_data):
        Profile.objects.filter(id=instance.pk).update(**validated_data)
        return instance

Посмотреть:

class ProfileChangeAPIView(generics.RetrieveAPIView,
                           mixins.DestroyModelMixin,
                           mixins.UpdateModelMixin):
    permission_classes = (
        permissions.IsAuthenticated,
    )
    serializer_class = ProfileChangeSerializer
    parser_classes = (MultiPartParser, FormParser,)

    def get_object(self):
        if not Profile.objects.filter(user__id=self.request.user.pk).exists():
            return Profile.objects.create(user=self.request.user)
        return self.request.user.profile

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

Поэтому, когда я пытаюсь загрузить userpic через интерфейс Django Rest Framework - он обновляет гиперссылку на изображение, но не создает файл изображения в media папка. Когда я загружаю изображение через интерфейс администратора django, все работает нормально. Где я не прав?

1 ответ

Решение

Я не думаю, что вам нужно переопределить Serializer update метод. Вы можете просто переопределить put При взгляде следующее:

def put(self, request, *args, **kwargs):
        serializer = ProfileChangeSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Кстати, как вы отправляете данные изображения из внешнего интерфейса? Я надеюсь, что вы используете jQuery FormData, как в /questions/24166564/django-rest-framework-zagruzka-fajla-cherez-ajax/24166581#24166581

Другие вопросы по тегам