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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:51:37