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

