在一个查询中获取第一个和最后一个项目

时间:2018-12-02 16:59:30

标签: python django

我想获得Django中的第一项和最后一项。 我当前的代码如下:

first = Article.objects.order_by('date').first()
last = Article.objects.order_by('date').last()

但是,这是两个查询。有没有办法从中进行查询?

1 个答案:

答案 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的优化可能不会那么大,尤其是与您为了阅读本文而引入的复杂性相比。