在Django REST Framework中获取文件参数(大小、文件名)的方法
我来帮你搞定这个需求~要在GET请求返回的结果里加上文件名和文件大小,你可以通过扩展Django REST Framework的序列化器来实现,下面给你两种常用的方案:
方案一:使用SerializerMethodField(直观易懂)
这种方式通过为每个额外字段定义单独的处理方法,逻辑清晰,容易维护:
class MovieSerializer(serializers.ModelSerializer): attachment = serializers.FileField() # 新增文件名和文件大小的自定义字段 filename = serializers.SerializerMethodField() file_size = serializers.SerializerMethodField() class Meta: model = Movie fields = ('title', 'attachment', 'filename', 'file_size') def get_filename(self, obj): # 先判断文件是否存在,避免空指针错误 if obj.attachment: # 从文件路径中提取纯文件名(比如从"files/courses/test.pdf"拿到"test.pdf") return obj.attachment.name.split('/')[-1] return None def get_file_size(self, obj): if obj.attachment: # 获取文件大小,单位是字节,你可以根据需求转换成KB/MB return obj.attachment.size return None
方案二:重写to_representation方法(适合批量添加字段)
如果需要添加多个额外字段,重写序列化器的to_representation方法会更紧凑,一次性处理所有扩展逻辑:
class MovieSerializer(serializers.ModelSerializer): attachment = serializers.FileField() class Meta: model = Movie fields = ('title', 'attachment') def to_representation(self, instance): # 先获取默认的序列化结果(包含title和attachment的URL) data = super().to_representation(instance) # 追加文件名和文件大小字段 if instance.attachment: data['filename'] = instance.attachment.name.split('/')[-1] data['file_size'] = instance.attachment.size else: data['filename'] = None data['file_size'] = None return data
注意事项:
- 因为你的
attachment字段允许为null,所以一定要加判断逻辑,否则当没有上传文件时调用obj.attachment.name会抛出异常。 - 文件大小返回的是字节数,如果需要转换成KB/MB,可以在方法里做转换,比如
return round(obj.attachment.size / 1024, 2)(转换成KB并保留两位小数)。
内容的提问来源于stack exchange,提问作者yestema
相关产品推荐
相关产品推荐

