Django中如何用单次SQL请求查询所有用户及其最新发布的文章
Django 单查询获取所有用户及对应最新文章
实现代码
首先导入必要的ORM工具:
from django.db.models import F, OuterRef, Subquery
然后执行查询即可:
# 构造子查询:匹配对应用户,按发布时间倒序取最新一篇文章的内容 latest_article_subquery = Article.objects.filter( user=OuterRef("pk") ).order_by("-created_at").values("content")[:1] # 给User对象注解上模板需要的字段,全程仅执行1次SQL查询 users = User.objects.annotate( full_name=F("name"), # 将原有name字段别名成模板需要的full_name变量 last_message=Subquery(latest_article_subquery) )
使用说明
- 该方案通过
Subquery+OuterRef的组合将子查询合并到主查询逻辑中,全程只会触发一次数据库请求,完全符合你的要求。 - 没有发布过文章的用户,
last_message字段值会为None,你可以在模板中自行添加条件判断做展示兼容。 - 查询得到的
users查询集可以直接放到模板上下文里,用你给出的遍历代码直接渲染即可,完全匹配你需要的输出格式。
如果你需要同时获取最新文章的其他字段(比如发布时间),只需要修改子查询的
values参数,再新增对应的注解字段即可。
内容的提问来源于stack exchange,提问作者Efraim
相关产品推荐
相关产品推荐

