0

purpose

I want to make POST parameter image can be filled with url file base64 but save as a image.

code

models.py

class Item(models.Model):
    image = models.ImageField(upload_to='item')
    ...

views.py

class ItemViewSet(viewsets.ModelViewSet):
    queryset = Item.objects.all()
    serializer_class = ItemSerializer

    def create(self, request):
        if request.data.get('type') == 'url':
            request.POST._mutable = True
            request.data['image'] = convert_from_url(request.data['image'])
        serializer = ItemSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

I modify the request data when input type is url.

convert_from_url is a method to save a image to TemporaryFile and pack in InMemoryUploadedFile

serializers.py

class ItemSerializer(serializers.ModelSerializer):

    def create(self, validated_data):
        item = Item.objects.create(
            image=validated_data['image']
        )
        ...
        item.save()
        return item

Problem

serializer = ItemSerializer(data=request.data) this line didn't pass correct request.data (it didn't contain data)

validated_data (serializers) didn't get image when I modified it before

SheiUn
  • 9
  • 1
  • 4

1 Answers1

0

In my case I have avatar and avatar_url fields in my model and I'm calling that from view, mayby that can help you in some way.

Snippet code:

    def get_remote_image(self):
        if self.avatar_url and not self.avatar:
            img_temp = NamedTemporaryFile(delete=True)
            img_temp.write(urlopen(self.avatar_url).read())
            img_temp.flush()
            self.avatar.save(f"avatar_img_{self.pk}.jpeg", File(img_temp))
        self.save()
SheiUn
  • 9
  • 1
  • 4
slqq
  • 245
  • 2
  • 3
  • 13