我想获得Django中的第一项和最后一项。 我当前的代码如下:
first = Article.objects.order_by('date').first()
last = Article.objects.order_by('date').last()
但是,这是两个查询。有没有办法从中进行查询?
答案 0 :(得分:2)
您可以使两个查询集组成一个 union 。由于仅在必要时评估这些查询集,因此不评估各个查询集,例如:
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的优化可能不会那么大,尤其是与您为了阅读本文而引入的复杂性相比。