首页 > 解决方案 > 除了在 django 中使用 forloop 之外,查询和连接多个查询集的更好方法是什么?

问题描述

我有一个模型项目:

Item:
 batch_no

batch_no可以是从1到 的任何东西20。数据库中有 1000 多个项目。

现在。我需要获取4每个 batch_no 的第一个元素。

我知道通过使用 forloop 查询和附加来做到这一点。

batches = Item.objects.values('batch_no').exclude(batch_no__isnull=True).distinct()
blist=[]
for batch in batches:
    bitems= Item.objects.filter(batch_no=batch['batch_no'])[:4]
    blist.append(bitems)
return blist

还有比这更好的方法吗?在单个查询中做什么?

我是 Django 的新手。

标签: djangodjango-modelsdjango-viewsdjango-queryset

解决方案


这是一个类似的问题。简短的回答是:

Item.objects.annotate(rank=Window(
    expression=Rank(),
    order_by=F('batch_no').desc(),
    partition_by=[F('batch_no')])
).filter(rank__lte=4)

查看Django 2.0 中的Rank 窗口函数。它将允许您抓取Top N组内的元素,如此处的示例所示


推荐阅读