场景:我使用S3 Boto将Amazon S3用作默认存储空间,所有文件将转到我的存储桶中的'media'文件夹。
问题:当我使用serializers.serialize
将包含我的FileField的模型序列化为json时,我在json中获得的只是'media / abc.png'或类似的东西。有没有办法在json中自动获取文件url而不是相对路径,还是应该每次手动将url添加到json响应中?
答案 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)
我有一个类似的设置,以下对我有用 -
删除/注释掉 (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