如何在SQLite环境下基于Django模型获取4个成员最新的Inpatient表记录
实现方案
你使用的是SQLite数据库,以下两种实现方式都可以满足每秒查询的性能要求,兼容度不同可以按需选择:
方案1:Subquery方案(兼容所有SQLite版本,性能最优)
这是兼容性最好的写法,仅执行1次SQL查询,不需要额外遍历加工数据:
from django.db.models import Subquery, OuterRef # 构造子查询:匹配对应成员的Inpatient记录,按更新时间倒序取第一条的ID latest_inpatient_sub = Inpatient.objects.filter( member_id=OuterRef('pk') ).order_by('-update_time').values('pk')[:1] # 直接查询得到4条每个成员对应的最新Inpatient记录 latest_inpatients = Inpatient.objects.filter( pk__in=Subquery(latest_inpatient_sub) ) # 如果需要同时关联返回成员基础信息,可以用以下写法 members_with_latest_inpatient = Member.objects.annotate( latest_inpatient_id=Subquery(latest_inpatient_sub) ).prefetch_related('member')
方案2:DISTINCT ON方案(SQLite 3.38.0+版本支持,写法更简洁)
SQLite从3.38.0版本开始支持DISTINCT ON语法,可以直接按分组字段去重,拿到每组排序后的第一条记录:
latest_inpatients = Inpatient.objects.order_by( 'member_id', # 必须先按分组字段排序 '-update_time' # 再按更新时间倒序,保证每组第一条是最新记录 ).distinct('member_id')
注意事项
- 你当前的
Inpatient.update_time字段设置的是auto_now_add=True,只有创建记录的时候会自动写入时间,如果你后续会更新Inpatient记录的状态、体征数据,建议改成auto_now=True,保证更新时间同步变更,查询的最新记录才准确。 - 两种方案的性能都可以满足每秒1次的查询频率,不需要额外做缓存优化。
内容的提问来源于stack exchange,提问作者김민수
相关产品推荐
相关产品推荐

