Django使用ORM为每个组选择前n个记录



根据这个问题,我试图根据critera获得每个组的前10条记录,但Django返回了这个错误:

from django.db.models import F, Window
from django.db.models.functions import RowNumber
Purchases.objects.annotate(row_number=Window(
expression=RowNumber(),
partition_by=F('customer'),
order_by=F('field_of_interest').desc()
)
).filter(row_number=10)
raise NotSupportedError(
django.db.utils.NotSupportedError: Window is disallowed in the filter clause.

当我删除.desc((时,错误消息变为:

ValueError: order_by must be either an Expression or a sequence of expressions.

我正在使用PostgreSql。这是一个bug还是我在查询中的某个地方出错了?

我们可以在Subquery的帮助下选择每组前n个。

首先,让我们获得每个客户的前n次购买

top_n_purchases_per_customer = Purchases.objects.filter(
customer=OuterRef('customer')
).order_by('-field_of_interest')[:10]

接下来,我们可以从每个客户的前10名中选择具有匹配id的采购。

top_n_purchases = Purchases.objects.filter(
id__in=Subquery(top_n_purchases_per_customer.values('id'))
)

生成的查询使用相关的子查询,因此可能会变慢。确保使用field_of_interestcustomer的索引(最好是两个字段的组合索引(请参阅Django文档中的index_together((

最新更新