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

如何在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,提问作者김민수

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:36:08