Django使用OuteRef通过最大值过滤来获取记录

pgpifvop  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(118)

我有一个名为CGDSStudy的Django模型,其中包含字段nameurlversion

class CGDSStudy(models.Model):
    name = models.CharField(max_length=300)
    url = models.CharField(max_length=300)
    version = models.PositiveSmallIntegerField(default=1)

同一检查的多个版本可以存在于同一URL中,但我只想检索最后一个版本的检查。以下是三次失败的尝试:

尝试1:

from django.db.models import Max, OuterRef, Exists

cgds_studies = CGDSStudy.objects.all()
cgds_studies = cgds_studies.filter(
    Exists(CGDSStudy.objects.annotate(max_version=Max('version')).filter(url=OuterRef('url'), max_version=OuterRef('version')))
)

此尝试检索所有检查,而不是上一版本的检查。

尝试2:

cgds_studies = cgds_studies.filter(
    version=Max(CGDSStudy.objects.filter(url=OuterRef('url')).values('version'))
)

此尝试引发错误"cgdsstudy.version" must appear in the GROUP BY clause or be used in an aggregate function

尝试3:

cgds_studies = cgds_studies.filter(
    version=CGDSStudy.objects.filter(url=OuterRef('url')).annotate(max_version=Max('version')).values('max_version')[0]
)

此尝试引发错误This queryset contains a reference to an outer query and may only be used in a subquery.

2hh7jdfx

2hh7jdfx1#

你可以使用**Subquery**表达式[Django-doc]:

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

CGDSStudy.objects.alias(
    max_version=Subquery(
        CGDSStudy.objects.filter(url=OuterRef('url'))
        .order_by('-version')
        .values('version')[:1]
    )
).filter(version=F('max_version'))

相关问题