2017-08-02 41 views
1

我正在創建一個將圖像保存在django模型中的API。通過API發送一個URL,django負責下載圖像並將其保存在模型中。使用序列化器從URL保存圖像

這是我的模型:

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) 

這是我的串行:

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

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

從我產生PIL對象的URL。如何指定存儲對象的序列化程序?我的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) 

現在,我節省了空的像場。

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

我想給PIL對象添加到request.data,它看起來像這樣:

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

謝謝!

回答

0

您可以在串行器
所以基本上是真實的生活工作示例,請注意,我們需要設置圖像爲相對路徑attrs設置,當它直接做。
你也需要檢查響應的狀態,但是這個我會離開給你)

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 

而且,我會離開這裏如何定義視圖

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