如何在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
相关产品推荐
相关产品推荐

