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

DRF中如何将ReportVersion的version作为键生成文件版本字典?

解决方案

1. 修复版本号生成逻辑(关键bug)

你的ReportVersionInfo的save方法当前是全局取最大版本号,会导致不同Report的版本号互相干扰,需要改成针对当前关联的Report取最大版本:

def save(self, *args, **kwargs):
    if self._state.adding:
        # 仅针对当前report查询最大版本号
        last_version = ReportVersionInfo.objects.filter(report=self.report).aggregate(largest=models.Max('version'))['largest']
        self.version = last_version + 1 if last_version is not None else 1

2. 修改序列化器实现目标格式

在ReportsSerializers中实现get_report_file方法,遍历当前Report关联的所有版本,构建{版本号: 文件路径}的字典:

class ReportsSerializers(serializers.ModelSerializer):
    report_file = serializers.SerializerMethodField()

    class Meta: 
        model = models.Report
        fields = ['employee','file_name', 'report_file',]

    def get_report_file(self, instance):
        # 获取当前report下的所有版本记录
        versions = instance.reportversioninfo_set.all()
        # 构建目标格式的字典
        return {
            version.version: version.file.url  # 使用file.url获取文件的访问路径
            for version in versions
        }

补充说明

  • instance.reportversioninfo_set.all()是Django自动生成的反向关联查询方法,用于获取当前Report对应的所有ReportVersionInfo实例
  • version.file.url会返回文件的完整访问路径,若需要本地存储路径,可替换为version.file.path
  • 若需要版本按顺序排列,可在查询时追加.order_by('version'),确保字典内版本有序

内容的提问来源于stack exchange,提问作者m1rsadikov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 12:52:29