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

