Django Rest Framework: загрузка изображения в определенный объект существующей модели
Здравствуйте, я пытаюсь загрузить изображение с помощью Rest API [через Postman] в объект, который уже существует, и все его поля заполнены, кроме изображения. Я использую метод PUT, чтобы сначала получить объект, в который я хочу загрузить изображение, а затем пытаюсь передать его через сериализатор. Изображения должны быть загружены в мое ведро S3.
.
Код для моего views.py:
@api_view(['PUT'])
@permission_classes([IsAuthenticated])
def putproof(request):
app=MasterTaskHolder.objects.filter(title=request.data['title'],user=request.user)
serializer=ImageUploadSerializer(app,data=request.data,partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response("Posted")
Мой сериализатор:
class ImageUploadSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = MasterTaskHolder
fields = (
'title','image'
)
Моя модель:
class MasterTaskHolder(models.Model):
status_code = [
('C', 'Completed'),
('P', 'Pending'),
]
title = models.CharField(max_length=50)
point = models.IntegerField()
category = models.CharField(max_length=50, null=True, blank=True)
status = models.CharField(max_length=2, choices=status_code, default='P')
user = models.ForeignKey(User, on_delete=models.CASCADE)
image = models.ImageField(null=True, blank=True, upload_to="imageproof/")
def __str__(self):
return (f'{self.user} - '+(f'{self.title}'))
Я действительно новичок в Django и DRF, любая помощь будет оценена по достоинству.
Спасибо.
Попробуйте это?
class ImageUploadSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = MasterTaskHolder
fields = (
'title','image'
)
def update(self, instance: MasterTaskHolder, validated_data):
instance.image = validated_data['image']
instance.save()
return instance
В представлениях вместо использования serializer.save()
используйте переопределенное обновление, которое мы только что создали
serializer.update(instance, serializer.validated_data)
Также вы отправляете queryset в сериализатор, вам нужно изменить это на сам объект и скромное предложение не забудьте проверить, существует ли этот объект или нет.