首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django REST框架和FileField绝对url

Django REST框架和FileField绝对url
EN

Stack Overflow用户
提问于 2014-05-29 01:54:30
回答 11查看 31.4K关注 0票数 34

我已经定义了一个简单的Django应用程序,其中包括以下模型:

代码语言:javascript
复制
class Project(models.Model):
    name = models.CharField(max_length=200)
    thumbnail = models.FileField(upload_to='media', null=True)

(从技术上讲,是的,这可能是一部ImageField。)

在模板中,将URL值(以settings.py编码)作为缩略图MEDIA_URL的前缀非常容易。下面的代码运行良好:

代码语言:javascript
复制
<div id="thumbnail"><img src="{{ MEDIA_URL }}{{ current_project.thumbnail }}" alt="thumbnail" width="400" height="300" border="0" /></div>

使用DRF,我定义了一个名为ProjectSerializer的HyperlinkedModelSerializer后代:

代码语言:javascript
复制
class ProjectSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Project
        fields = ( 'id' ,'url', 'name', 'thumbnail')

我已经定义了一个非常简单的ModelViewSet后代:

代码语言:javascript
复制
class ProjectViewSet(viewsets.ModelViewSet):
    queryset = Project.objects.all()
    serializer_class = ProjectSerializer

生成的JSON示例如下所示:

代码语言:javascript
复制
{
    "id": 1, 
    "url": "http://localhost:8000/api/v1/projects/1/", 
    "name": "Institutional", 
    "thumbnail": "media/institutional_thumb_1.jpg"
}

我还不能想出如何在我的项目的JSON表示中提供一个包含图像完整url的缩略图字段。

我认为我需要在ProjectSerializer中创建一个自定义字段,但没有成功。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2014-05-29 02:14:19

试试SerializerMethodField

示例(未测试):

代码语言:javascript
复制
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。一种方法是在创建序列化程序时显式地传递它,类似于:

代码语言:javascript
复制
serializer = MySerializer(account, context={'request': request})
票数 57
EN

Stack Overflow用户

发布于 2014-05-29 02:51:22

谢谢你,沙文沃特。您的示例和文档参考提供了极大的帮助。我的实现略有不同,但与您发布的非常接近:

代码语言:javascript
复制
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') 
票数 10
EN

Stack Overflow用户

发布于 2014-08-07 04:01:12

要获取使用FileField的文件的url,您可以调用FieldFile的url属性(这是文件实例,而不是字段),它使用Storage类来确定此文件的url。如果你使用的是像亚马逊S3这样的外部存储,或者如果你的存储发生了变化,这是非常简单的。

get_thumbnail_url应该是这样的。

代码语言:javascript
复制
def get_thumbnail_url(self, obj):
    return obj.thumbnail.url

您也可以这样在模板中使用它:

代码语言:javascript
复制
{{ current_project.thumbnail.url }}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23918619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档