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

Django多对多模型:如何在Admin面板批量添加患者分析数据

解决方案

要实现选择分析组后批量添加对应分析项数值的需求,你需要拆分数据模型结构,通过一对多关联存储每个分析项的具体数值,再结合Django Admin的内联功能实现批量编辑。

1. 调整模型结构

修改PatientGroupAnalysis作为分析组的主记录,并新增PatientAnalysisResult模型单独存储每个分析项的数值:

class PatientGroupAnalysis(models.Model):
    patient = models.ForeignKey(Patient, on_delete=models.CASCADE)
    analysis_date = models.DateTimeField()
    analysis_group = models.ForeignKey(AnalysysGroup, on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.patient} - {self.analysis_date} - {self.analysis_group}"

class PatientAnalysisResult(models.Model):
    group_analysis = models.ForeignKey(PatientGroupAnalysis, on_delete=models.CASCADE, related_name="analysis_results")
    analysis_type = models.ForeignKey(AnalysisType, on_delete=models.CASCADE)
    value = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True)

    def __str__(self):
        return f"{self.analysis_type.a_name}: {self.value} {self.analysis_type.a_measur}"

核心说明:

  • PatientGroupAnalysis作为一组分析的主记录,关联患者、分析日期和目标分析组
  • PatientAnalysisResult存储单个分析项的数值,通过group_analysis关联到主记录,analysis_type绑定具体的分析类型
  • related_name用于从主记录反向快速查询所有分析结果

2. 配置Django Admin实现批量添加

在admin.py中配置内联模型,并添加自动生成分析项的逻辑:

from django.contrib import admin
from .models import PatientGroupAnalysis, PatientAnalysisResult

class PatientAnalysisResultInline(admin.TabularInline):
    model = PatientAnalysisResult
    extra = 0  # 默认不显示冗余空行

class PatientGroupAnalysisAdmin(admin.ModelAdmin):
    inlines = [PatientAnalysisResultInline]
    list_display = ('patient', 'analysis_date', 'analysis_group')

    def save_model(self, request, obj, form, change):
        super().save_model(request, obj, form, change)
        # 新增记录时,根据选中的分析组自动创建对应分析项的空记录
        if not change:
            for analysis_type in obj.analysis_group.analysis.all():
                PatientAnalysisResult.objects.get_or_create(
                    group_analysis=obj,
                    analysis_type=analysis_type
                )

admin.site.register(PatientGroupAnalysis, PatientGroupAnalysisAdmin)
admin.site.register(PatientAnalysisResult)

核心说明:

  • PatientAnalysisResultInline作为内联表格,嵌入到PatientGroupAnalysis的Admin页面,实现同页编辑
  • save_model方法的逻辑:新增主记录时,自动遍历选中分析组的所有分析类型,创建对应的空数值记录,直接在Admin页面批量填写即可

3. 可选:优化Admin数据一致性

如果需要禁止手动修改分析项(确保与分析组绑定),可以修改内联类:

class PatientAnalysisResultInline(admin.TabularInline):
    model = PatientAnalysisResult
    extra = 0
    can_delete = False  # 禁止删除自动生成的分析项
    readonly_fields = ('analysis_type',)  # 分析类型设为只读,避免篡改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:50:27