gpt4 book ai didi

python - 如何在 django 中过滤查询集以达到每个组的最大成员数?

转载 作者:行者123 更新时间:2023-11-29 06:49:03 24 4
gpt4 key购买 nike

模型是这样的:

class Application(models.Model):
application_id = models.IntegerField()
version_id = models.IntegerField()
# some other attributes

其中 application_idversion_id 一起确定一个 Application 条目,因为一个应用程序可能有多个版本,并且一个条目具有最大的 version_id 是应用程序的当前版本。

目标是找到所有应用程序的当前版本。 SQL(在 MySQL 中)类似于:

SELECT
*
FROM application AS app
WHERE version_id = (SELECT max(version_id)
FROM application
WHERE application_id = app.application_id);

如何实现这一目标?

请注意,这里的对象是过滤QuerySet,而不是仅获取最大的version_id,这就像简单的使用GROUP BY,或者在django中使用values(),后跟annotate()。我对当前版本的其他属性也很感兴趣。

最佳答案

我自己想出来了。 OuterRefSubQuery 是技巧,它们是 Django 1.11 中的新功能,如文档 here 所示。 .

from django.db.models import OuterRef, Subquery, F

def filter_to_current(qs: QuerySet):
qs = qs.annotate(current=Subquery(qs.filter(application_id=OuterRef('application_id'))
.order_by('-version_id').values('version_id')[:1])) \
.filter(version_id=F('current'))

关于python - 如何在 django 中过滤查询集以达到每个组的最大成员数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48230843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com