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

DRF序列化Django FileField时Unicode文件名转ASCII问题求助

问题

Django模型中包含一个存储Unicode文件名的FileField,使用DRF序列化时,该字段的文件名被转换为URL编码格式(例如数据库中的költségek-2022-09-09.xlsx,API返回为k%C3%B6lts%C3%A9gek-2022-09-091.xlsx),其他含Unicode字符的字段均正常显示,仅FileField出现此问题。尝试在序列化器中显式指定utf-8编码无效,请问是否需要单独声明该字段并设置正确编码?具体该如何操作?

序列化器代码

class UploadModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.DatauploadUploadmodel
        fields = '__all__'

模型代码

class DatauploadUploadmodel(models.Model):
    table = models.CharField(max_length=50)
    file = models.FileField(upload_to='upload_files/', max_length=200 )
    user_id = models.IntegerField()
    is_new_table = models.BooleanField(blank=True, null=True)
    skiprows = models.IntegerField(blank=True, null=True)
    status_description = models.CharField(
        max_length=100, default="Feldolgozásra vár", blank=True, null=True)
    status = models.CharField(max_length=100, blank=True, null=True)
    upload_timestamp = models.DateTimeField()
    mode = models.TextField()

    class Meta:
        managed = False
        db_table = 'dataupload_uploadmodel'

视图代码

class UploadmodelList(generics.ListCreateAPIView):
    queryset = models.DatauploadUploadmodel.objects.all()
    serializer_class = serializers.UploadModelSerializer
    permission_classes = [AuthorAllUser]

API返回的文件名

k%C3%B6lts%C3%A9gek-2022-09-091.xlsx

数据库中的文件名

költségek-2022-09-09.xlsx

解决方案

需要自定义序列化字段来处理FileField的文件名解码,DRF默认会对文件URL进行URL编码,所以要在序列化时手动解码文件名部分。

步骤1:自定义FileField序列化字段

在序列化器所在文件中添加自定义字段:

from urllib.parse import unquote
from rest_framework import serializers

class UnicodeFileField(serializers.FileField):
    def to_representation(self, value):
        # 获取原始的文件URL
        url = super().to_representation(value)
        if url:
            # 解码URL中的文件名部分
            return unquote(url)
        return url

步骤2:在序列化器中使用自定义字段

修改原序列化器,显式声明file字段为自定义的UnicodeFileField:

class UploadModelSerializer(serializers.ModelSerializer):
    file = UnicodeFileField()

    class Meta:
        model = models.DatauploadUploadmodel
        fields = '__all__'

说明

  • DRF的默认FileField会对生成的文件URL进行URL编码,导致Unicode文件名被转义;
  • 通过urllib.parse.unquote可以将URL编码的字符串解码回原始Unicode格式;
  • 自定义字段仅修改序列化输出的格式,不影响文件的存储和读取逻辑。

内容的提问来源于stack exchange,提问作者Zsámboki Attila

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:05:37