2016-04-22 1 views
1

Сценарий: Я использую Amazon S3 в качестве хранилища по умолчанию, используя S3 Boto, и все файлы будут иметь значение «media» папка в моем ковше.Почему Django не сериализует FileField в URL-адрес файла при использовании AWS S3

Вопрос: Когда я сериализации модель, содержащую мой FileField к JSon используя serializers.serialize, все это я получаю в JSON является «СМИ/abc.png» или что-то в этом роде. Есть ли способ автоматически получить URL-адрес файла в json вместо относительного пути или я должен вручную добавить URL-адрес в ответ json каждый раз?

ответ

1

Django работает с File objects, хранилищами и файловыми полями. Filefield сохраняет какой-то идентификатор хранилища для файла. Этот идентификатор помогает хранилищу найти нужное местоположение файла. По умолчанию сериализатор получает только этот идентификатор. И этот идентификатор представляет собой строковое представление объекта файла django.

Если вы хотите вернуться URL, необходимо переопределить метод сериализатора:

from django.core import serializers 
from django.db import models 

JSONSerializer = serializers.get_serializer("json") 

JSONWithURLSerializer(JSONSerializer): 

    def handle_field(self, obj, field): 
     value = field.value_from_object(obj) 
     if isinstance(field, models.FileField) and hasattr('url', value): 
      self._current[field.name] = value.url 
     else: 
      return super(JSONWithURLSerializer, self).handle_field(obj, field) 

serializer = JSONWithURLSerializer() 
serializer.serialize(queryset) 
data = serializer.getvalue() 
+0

Я уже думал на линиях этого. Спасибо за ответ. – r3ign

+0

Есть ли причина, по которой django не поддерживает это из коробки? Я считаю, что любой файл должен автоматически указывать на MEDIA_ROOT + Rel.PATH по умолчанию. – r3ign

Смежные вопросы