简体   繁体   English

使用序列化器从URL保存图像

[英]Save image from URL with serializer

I am creating an API that saves images in a django model. 我正在创建一个将图像保存在Django模型中的API。 Through the API is sent a URL and django is responsible for downloading the image and saving it in the model. 通过API发送一个URL,django负责下载图像并将其保存在模型中。

This is my model: 这是我的模型:

class Picture(Media):
    image = models.ImageField(upload_to=picture_path, blank=True, null=True)
    entity = models.CharField(max_length=20, choices=ENTITIES,
                          default=ENTITY_CLASIFICADO)

This is my serializer: 这是我的序列化器:

class PictureSerializer(serializers.ModelSerializer):
    image = serializers.ImageField(max_length=None, use_url=True)

    class Meta:
        model = Picture
        fields = ("pk", "image", "entity",)

From the URL I generate a PIL object. 我从URL生成一个PIL对象。 How do I specify the serializer that stores the object? 如何指定存储对象的序列化程序? My views.py 我的views.py

class PictureViewSet(generics.ListCreateAPIView):
    def create(self, request, *args, **kwargs):
        r = requests.get(request.data["url"])
        img_temp = NamedTemporaryFile(delete = True)
        img_temp.write(r.content)

Now, I'm saving the empty image field. 现在,我要保存空白图像字段。

serializer = self.get_serializer(data=request.data)

I would like to add the PIL object to request.data and it looks like this: 我想将PIL对象添加到request.data,它看起来像这样:

<QueryDict: {'url': ['https://s3.amazonaws.com/cat/encabezado.jpg'], 'image': ['MY PIL IMAGE'], 'entity': ['clasificado'], 'csrfmiddlewaretoken': ['JRMLIXkxqg6sF5YP19NLTvgFOmVWH9ARSmM']}>

Thanks! 谢谢!

you can do that directly in serialiser 您可以直接在序列化器中执行此操作
So basically it is real life working example, note that we need to set image as relative path when setting it in attrs . 因此,基本上,这是现实生活中的工作示例,请注意,在attrs设置图像时,需要将其设置为相对路径。
Also you need to check status of response, but this i'll leave up to you ) 另外,您需要检查响应状态,但是我会留给您)

import os, uuid, requests
from django.conf import settings
from rest_framework.serializers import ModelSerializer
from .models import Audio

class AudioCreateSerializer(ModelSerializer):
    class Meta:
        model = Audio
        fields = ['image']

    def validate(self, attrs):
        url = "http://youurlgoeshere.com/sddsjdsjdsjds.png"
        data = requests.get(url)
        response = requests.get(image_url)
        random_name = uuid.uuid4().hex + ".png"
        folder_name = "custom_images"
        absolute_file_path = os.path.join(settings.MEDIA_ROOT, folder_name, random_name)
        relative_path = os.path.join(folder_name, random_name)
        with open(absolute_file_path, 'wb') as f:
            f.write(response.content)
        attrs['image'] = relative_path
        return attrs

Also, i'll leave here how to define views 另外,我将在这里留下如何定义视图的信息

class AudioListView(ListCreateAPIView):
    renderer_classes = [JSONRenderer]
    queryset = Audio.objects.select_related("artist")

    def get_serializer_class(self):
        if self.request.method == "GET":
            return AudioListSerializer
        if self.request.method == "POST":
            return AudioCreateSerializer

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM