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

Django如何通过多层关联关系获取Patient对应的Unite名称列表

问题原因

原有代码将整个ICF查询集序列化后整体塞入unitename列表,导致出现多层嵌套,完全不需要走序列化转JSON的冗余流程,直接遍历关联对象取值即可。

优化后的实现代码

from django.http import JsonResponse
from .models import Patient

def listPatients(request):
    # 预加载关联的ICF表和对应的Unite表,避免循环查询数据库,解决N+1性能问题
    patients = Patient.objects.all().prefetch_related('Intensivecare_form__unites_id')
    output = []
    for patient in patients:
        # 直接遍历关联的ICF对象,取出对应Unite的unitename字段
        unitenames = [icf.unites_id.unitename for icf in patient.Intensivecare_form.all()]
        # 如果需要对重复的单位名称去重,替换为下面这行即可
        # unitenames = list({icf.unites_id.unitename for icf in patient.Intensivecare_form.all()})
        output.append({
            'id': patient.id,
            'fname': patient.name,
            'lname': patient.lastname,
            'data': patient.data,
            'unitename': unitenames,
        })
    return JsonResponse(output, safe=False)

代码说明

  • 修改后返回的unitename字段就是纯字符串列表,没有多余嵌套,直接就能拿到所有单位名称
  • 用prefetch_related一次性把所有关联的ICF、Unite数据提前查出来,原有写法每次遍历患者都会触发额外查询,数据量大会有严重性能问题
  • 可选去重逻辑适合同一个患者关联多个ICF但对应同一个单位的场景,按需开启即可

小提示:Django 外键字段命名无需额外加_id后缀,框架会自动在数据库存储的列名后追加_id,你当前的写法会导致数据库实际列名变成unites_id_id,不符合常规命名规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 18:18:03