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

