2016-02-29 3 views
7

Я работаю с приложением, используя Django Rest Framework.Загрузка изображений с использованием RESTAPI

models.py

class Image(models.Model): 
    image_meta = models.ForeignKey('Image_Meta',on_delete=models.CASCADE,) 
    image_path = models.URLField(max_length=200) 
    order = models.IntegerField() 
    version = models.CharField(max_length=10) 

serializers.py

class ImageSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Image 
     field = ('id', 'image_path' , 'order' , 'version') 

views.py

class ImageList(generics.ListCreateAPIView): 
    queryset = Image.objects.all() 
    serializer_class = ImageSerializer 

class ImageDetail(generics.RetrieveUpdateDestroyAPIView): 
    queryset = Image.objects.all() 
    serializer_class = ImageSerializer 

URL шаблоны

url(r'^image/$',views.ImageList.as_view(),name='image_list'), 
url(r'^image/(?P<pk>[0-9]+)/$',views.ImageDetail.as_view(),name='image_detail') 

Это только часть всей системы. Я хочу загрузить изображения с помощью RESTAPI, а затем загрузить его на amazon s3, а затем получить URL-адрес и сохранить его в поле image_path. Я видел предыдущие решения для загрузки файлов с помощью REST (like this), но ничего не работало для моего дела. Может кто-нибудь предложить, как я могу это сделать?

+0

Вы должны просто использовать 'ImageField'. При этом фактическое изображение будет сохранено только в S3, и поле в БД будет иметь путь к изображению, которое в коде вы можете получить с помощью 'image.url'. –

+0

@SaurabhGoyal Пожалуйста, уточните, как я могу получить доступ к URL-адресу изображения? –

+0

Я получил его в любом случае :) –

ответ

0

Ну, я, наконец, понял, как это можно сделать. Я изменил image_path на ImageField, как предложил Saurabh Goyal. Я использовал этот код:

class Image(models.Model): 
    image_meta = models.ForeignKey('Image_Meta',on_delete=models.CASCADE,) 
    image_path = models.ImageField(upload_to='images-data') 
    order = models.IntegerField() 
    version = models.CharField(max_length=10) 

N при условии, моя Амазонке детали s3 ведра как в local_settings.py файла как:

AWS_S3_ACCESS_KEY_ID = "Access_key_id" 
AWS_S3_SECRET_ACCESS_KEY = "secret_access_key" 
AWS_STORAGE_BUCKET_NAME = "bucket_name" 

и добавил эту settings.py:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 

и вуаля !! Это сработало. Надеюсь, это поможет кому-то встать на ту же проблему, что и я.

0

Мы знаем, что изображения/файлы загружаются с использованием multipart/form-data. По умолчанию DRF не анализирует данные с несколькими данными.

Чтобы сделать многопараметрические данные drf, вы должны сообщить DRP, чтобы использовать парсер MultiPartParser.

from rest_framework.parsers import MultiPartParser 
class ImageList(generics.ListCreateAPIView): 
    ... 
    ...  
    parser_classes = (MultiPartParser) 
    ... 

Я рекомендую иметь в своем сериализаторе для поля изображения в imagefield, и обработать его там, чтобы загрузить на Амазонку и заполнить URLField