除了在Django中使用forloop之外,查询和加入多个查询集的更好方法?

时间:2018-07-23 06:14:33

标签: django django-models django-views django-queryset

我有一个模型商品:

Item:
 batch_no

batch_no可以是120之间的任何值。数据库中有数千个项目。

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

我知道可以使用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的新手。

1 个答案:

答案 0 :(得分:0)

这里是similar question。简短的答案是:

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 window function。如示例here

所示,它将允许您在组中抓取Top N个元素