我有一个模型商品:
Item:
batch_no
batch_no
可以是1
到20
之间的任何值。数据库中有数千个项目。
现在。我需要获取每个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的新手。
答案 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
个元素