如何在 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_id
和max_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]))
变量 queryset
是 Workflow
的 Queryset,包含每个 process_id
的最新版本。
我有一个带有 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_id
和max_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]))
变量 queryset
是 Workflow
的 Queryset,包含每个 process_id
的最新版本。