我有一个名为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存在,但我只想检索the last version个研究.以下是三次失败的try :

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

此try 检索所有研究,而不是上一个版本中的研究.

Attempt 2:

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

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

Attempt 3:

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

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

推荐答案

您可以使用Subquery expression [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'))

Django相关问答推荐

Django在保存时更新m2m对象

Django-表单(ModelForm)中的数据不保存在现有数据库中

Django allauth 社交帐户注册中邮箱的模板变量

如何自动删除 Django 模型中的字段值?

基于令牌的身份验证如何工作?

django 用一个提交按钮提交两种不同的表单

使用移动应用程序保护通信 [真实性、隐私和完整性]?

Django:将原始html(来自数据库)显示为html,而不是呈现

UnicodeDecodeError:asciicodec can't decode byte 0xe0 in position 0: ordinal not in range(128)

在 Django 应用程序之间共享模型

Django - 无法为具有动态 upload_to 值的 ImageField 创建迁移

在 Django 中使用 AuthenticationForm

使用 Django 1.5 实现多种用户类型

django 模板中对象的模型名称

在 django 中是否有生成 settings.SECRET_KEY 的功能?

在 Celery 任务中运行 Scrapy 蜘蛛

如何在 Django 中使用动态外键?

Django - 在设置中使用反向 url 映射

Django 模型(1054,Unknown column in 'field list')

Django REST 框架中的每个字段权限