2017-08-02 22 views
1

画像をDjangoモデルに保存するAPIを作成しています。 APIを介してURLが送信され、djangoは画像をダウンロードしてモデルに保存します。私はPILのオブジェクトを生成するURLからシリアライザでURLから画像を保存

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

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

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) 

これは私のシリアライザです:

は、これは私のモデルです。どのようにオブジェクトを格納するシリアライザを指定するのですか?私の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) 

私はrequest.dataにPILオブジェクトを追加したいと思いますし、それは次のようになります。

<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 
を定義する方法をここに残しておきます