为什么Django在使用AWS S3时不会将FileField序列化到文件URL

时间:2016-04-22 09:10:26

标签: django serialization amazon-s3

场景:我使用S3 Boto将Amazon S3用作默认存储空间,所有文件将转到我的存储桶中的'media'文件夹。

问题:当我使用serializers.serialize将包含我的FileField的模型序列化为json时,我在json中获得的只是'media / abc.png'或类似的东西。有没有办法在json中自动获取文件url而不是相对路径,还是应该每次手动将url添加到json响应中?

2 个答案:

答案 0 :(得分:1)

Django与File objects,Storages和FileField一起运作。 Filefield为文件保存某种存储标识符。此标识符可帮助存储找到文件的正确位置。默认情况下,serializer仅获取该标识符。该标识符是django文件对象的字符串表示。

如果要返回url,则需要覆盖序列化方法:

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

JSONSerializer = serializers.get_serializer("json")

class 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()

答案 1 :(得分:0)

我有一个类似的设置,以下对我有用 -

  1. 删除/注释掉 (your_project)/settings.py 中的 MEDIA_ROOT

如果您使用@api_view,请传递上下文并传递请求对象。

serializer = ProductSerializer(customer, context={"request": request})

或者如果您使用的是 ViewSet -

class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer

def get_serializer_context(self):
    return {'request': self.request}

你的序列化器 -

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'     #<--passing all values