python - Django REST Framework 和 FileField 绝对 url

标签 python django url filefield

我定义了一个简单的 Django 应用,其中包含以下模型:

class Project(models.Model):
    name = models.CharField(max_length=200)
    thumbnail = models.FileField(upload_to='media', null=True)

(技术上是的,这可能是一个 ImageField。)

在模板中,将 MEDIA_URL 值(在 settings.py 中正式编码)作为缩略图 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 中创建一个自定义字段,但没有成功。

最佳答案

试试 SerializerMethodField

示例(未经测试):

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})

关于python - Django REST Framework 和 FileField 绝对 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23918619/

相关文章:

python - 使用 WSGI 创建动态图像,不涉及文件

python - 如何检查 Pandas 系列中的所有元素是否等于特定值

python - 更新 python Tkinter 框架

django - 访问父类元素时的 InheritanceManager 错误 (Django 2.0)

python - Django 和 Angular 2 templateUrl

Python BeautifulSoup 不抓取这个网址

python - 更改 Firefox 首选项后,Selenium Firefox Webdriver 不会加载空白页面

django - 如何加密为Django默认的pbkdf2_sha256加密方式?

javascript - 我可以保存一个文件,该文件将仅使用 javascript/C/C++ 在服务器端从 php 代码生成,并且没有打开浏览器吗?

html - 具有多个参数的协议(protocol)处理程序