You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django序列化时去除FileField的主机地址

Django序列化FileField返回相对路径的实现方法

问题背景

我定义了如下Document模型:

class Document(models.Model):
    generated_document = models.FileField( # Celery从模板生成的文档
        upload_to='generated_files/',
        blank=True,
        null=True
    )
    ...

使用ModelSerializer序列化:

class DocumentSerialize(serializers.ModelSerializer):
    class Meta:
        model = Document
        fields = ["generated_document", ...]

期望返回的路径是/media/generated_files/expense_contract_2022-07-17-20-02-51.pdf,但实际返回带主机地址的完整URL:http://<HOST>/media/generated_files/expense_contract_2022-07-17-20-02-51.pdf。想通过SerializerMethodField实现去除主机地址,我的urls.py配置如下:

if settings.DEBUG:
    urlpatterns += static(
        settings.MEDIA_URL, document_root=settings.MEDIA_ROOT
    )

解决方案

直接用SerializerMethodField覆盖原字段,手动拼接相对路径即可,具体代码如下:

from rest_framework import serializers
from django.conf import settings
from .models import Document

class DocumentSerialize(serializers.ModelSerializer):
    # 用SerializerMethodField替换默认的FileField序列化逻辑
    generated_document = serializers.SerializerMethodField()

    class Meta:
        model = Document
        fields = ["generated_document", ...]

    def get_generated_document(self, instance):
        # 检查字段是否有值
        if instance.generated_document:
            # 拼接MEDIA_URL和文件相对路径,得到目标格式的相对URL
            return f"{settings.MEDIA_URL}{instance.generated_document.name}"
        # 没有文件时返回None或空值,根据需求调整
        return None

补充说明

  • instance.generated_document.name是文件相对于MEDIA_ROOT的路径,和配置的MEDIA_URL拼接后,正好是需要的相对路径格式。
  • 确保settings.py中MEDIA_URL已设置为/media/(默认配置通常就是这个),这样拼接后的路径就是/media/xxx/xxx.pdf。
  • 如果偏好从完整URL中截取相对部分,也可以用下面的写法:
def get_generated_document(self, instance):
    if instance.generated_document:
        full_url = instance.generated_document.url
        # 从完整URL中提取MEDIA_URL开始的部分
        return settings.MEDIA_URL + full_url.split(settings.MEDIA_URL)[-1]
    return None

内容的提问来源于stack exchange,提问作者mascai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:21:25