如何过滤一个查询集,使其在django中每个组的最大成员数?

zazmityj  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(357)

模型是这样的:

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

哪里 application_id 以及 version_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 a values() 接着是一个 annotate() . 我对当前版本的其他属性也感兴趣。

gzjq41n4

gzjq41n41#

我自己想出来的。 OuterRef 以及 SubQuery 是Django1.11中的新技巧,如本文所述。

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'))

相关问题