首页 > 解决方案 > 将 url 保存到 Django Rest Framework 中的图像字段

问题描述

目的

我想让 POST 参数image可以填充url file base64但保存为图像。

代码

模型.py

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

视图.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)

当输入类型为 url 时,我修改请求数据。

convert_from_url是一种将图像保存到TemporaryFile并打包的方法InMemoryUploadedFile

序列化程序.py

class ItemSerializer(serializers.ModelSerializer):

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

问题

serializer = ItemSerializer(data=request.data)此行没有传递正确的 request.data(它不包含数据)

validated_data(序列化程序)我之前修改它时没有得到图像

标签: djangodjango-rest-framework

解决方案


就我而言,我的模型中有 avatar 和 avatar_url 字段,我从视图中调用它,也许这可以在某种程度上帮助你。

片段代码:

    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()

推荐阅读