如何在 Django 的单个查询中获取所有以前可区分对象的最新版本?

How to get the latest version of a all previously distinctable objects within a single query in django?

我有一个带有 version 字段的模型。

class Workflow(models.Model):
    ...
    process_id = models.CharField(null=False, max_length=100) # not unique!
    version = models.IntegerField(default=1)
    enabled = models.BooleanField(default=True, null=False)

我试图在单个查询中为每个 process_id 查找最新版本。基本上,我想执行以下操作:

class WorkflowFilterSet(django_filters.FilterSet):
    ...
    only_latest_versions = django_filters.BooleanFilter(method='get_only_latest_versions')

    def get_only_latest_versions(self, queryset, field_name, value):
        if value:
            workflows = []
            for worflow in queryset.distinct('process_id'):
                workflow_ = queryset.filter(process_id=worflow.process_id,
                                            enabled=True).latest('version')
                workflows.append(workflow_)
            return workflows  # even if I wanted to do like this I can't because I must return a QuerySet
        return queryset

如何通过单个查询完成上述操作?

非常感谢!

编辑:

我可以使用以下查询检索最新版本:

queryset.filter(enabled=True).values('process_id').annotate(max_version=Max('version'))

然而,它returns,显然,只有process_idmax_version。如何使用这种方法检索所有字段或对象本身?

您可以使用 Subquery expressions together with OuterRef.

from django.db.models import OuterRef, Subquery
subquery = Workflow.objects.filter(process_id=OuterRef('process_id'), enabled=True).order_by('-version')
queryset = Workflow.objects.filter(version=Subquery(subquery.values('version')[:1]))

变量 querysetWorkflowQueryset,包含每个 process_id 的最新版本。