python - 在一个查询中获取第一项和最后一项
问题描述
我想在 Django 中获取第一项和最后一项。我当前的代码如下所示:
first = Article.objects.order_by('date').first()
last = Article.objects.order_by('date').last()
但是,这是两个查询。有没有办法从中进行一个查询?
解决方案
您可以合并两个查询集。由于仅在必要时评估这些查询集,因此不会评估单个查询集,例如:
qs = Article.objects.order_by('date')[:1].union(Article.objects.order_by('-date')[:1])
这qs
将包含两个元素,因此我们可以通过以下方式获取文章:
a1, a2 = Article.objects.order_by('date')[:1].union(Article.objects.order_by('-date')[:1])
尽管就个人而言,我认为这只会带来很多额外的混乱。
鉴于该表可能包含零个或一个元素,这甚至会使其变得更加困难,在这种情况下,我们需要:
qs = list(Article.objects.order_by('date')[:1].union(
Article.objects.order_by('-date')[:1],
all=True)
)
if qs:
a1, a2 = qs
else:
a1 = a2 = None
但正如@JonClemens所说,优化可能不会那么大,特别是与您为阅读本文而引入的复杂性相比。
推荐阅读
- javascript - 在 while 循环中使用 await 是一种不好的做法吗
- android - 浮动操作按钮未正确显示
- recursion - Prolog - 获取朋友的朋友列表
- visual-studio-code - VS Code 字符消失
- bash - 如何将输出值与各个变量相同
- google-maps-api-3 - Apps脚本中的Google Maps API不断失败
- java - 如何在函数的结果上设置监听器?
- db2 - 在 PLI/COBOL 程序中可以维护多少个(最大)DB2 多行提取游标?
- javascript - 在 React 中确认“返回”的导航
- yii2 - Yii2:发送响应内容后刷新()不起作用