我已经定义了一个简单的Django应用程序,其中包括以下模型:
class Project(models.Model):
name = models.CharField(max_length=200)
thumbnail = models.FileField(upload_to='media', null=True)
(从技术上讲,是的,这可能是一部ImageField。)
在模板中,将URL值(以settings.py编码)作为缩略图MEDIA_URL的前缀非常容易。下面的代码运行良好:
<div id="thumbnail"><img src="{{ MEDIA_URL }}{{ current_project.thumbnail }}" alt="thumbnail" width="400" height="300" border="0" /></div>
使用DRF,我定义了一个名为ProjectSerializer的HyperlinkedModelSerializer后代:
class ProjectSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Project
fields = ( 'id' ,'url', 'name', 'thumbnail')
我已经定义了一个非常简单的ModelViewSet后代:
class ProjectViewSet(viewsets.ModelViewSet):
queryset = Project.objects.all()
serializer_class = ProjectSerializer
生成的JSON示例如下所示:
{
"id": 1,
"url": "http://localhost:8000/api/v1/projects/1/",
"name": "Institutional",
"thumbnail": "media/institutional_thumb_1.jpg"
}
我还不能想出如何在我的项目的JSON表示中提供一个包含图像完整url的缩略图字段。
我认为我需要在ProjectSerializer中创建一个自定义字段,但没有成功。
发布于 2014-05-29 02:14:19
示例(未测试):
class MySerializer(serializers.ModelSerializer):
thumbnail_url = serializers.SerializerMethodField('get_thumbnail_url')
def get_thumbnail_url(self, obj):
return self.context['request'].build_absolute_uri(obj.thumbnail_url)
该请求必须对序列化程序可用,这样它才能为您构建完整的绝对URL。一种方法是在创建序列化程序时显式地传递它,类似于:
serializer = MySerializer(account, context={'request': request})
发布于 2014-05-29 02:51:22
谢谢你,沙文沃特。您的示例和文档参考提供了极大的帮助。我的实现略有不同,但与您发布的非常接近:
from SomeProject import settings
class ProjectSerializer(serializers.HyperlinkedModelSerializer):
thumbnail_url = serializers.SerializerMethodField('get_thumbnail_url')
def get_thumbnail_url(self, obj):
return '%s%s' % (settings.MEDIA_URL, obj.thumbnail)
class Meta:
model = Project
fields = ('id', 'url', 'name', 'thumbnail_url')
发布于 2014-08-07 04:01:12
要获取使用FileField的文件的url,您可以调用FieldFile的url属性(这是文件实例,而不是字段),它使用Storage类来确定此文件的url。如果你使用的是像亚马逊S3这样的外部存储,或者如果你的存储发生了变化,这是非常简单的。
get_thumbnail_url应该是这样的。
def get_thumbnail_url(self, obj):
return obj.thumbnail.url
您也可以这样在模板中使用它:
{{ current_project.thumbnail.url }}
https://stackoverflow.com/questions/23918619
复制相似问题