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

