Как отфильтровать набор запросов по наибольшему значению в одном поле, сгруппированному по каждому значению в другом поле? - PullRequest
0 голосов
/ 10 марта 2020

Если у меня есть такая модель

from django.db import models

class Thing(models.Model):
    name = models.CharField(max_length=255, unique = True, null=False)
    version = models.IntegerField(null = False)
    type = models.CharField(max_length=255, null=False)

, и у меня есть несколько записей типа

Thing.objects.create(name = "foo1", version = 1, type = "A")
Thing.objects.create(name = "foo2", version = 2, type = "A")
Thing.objects.create(name = "bar1", version = 1, type = "B")
Thing.objects.create(name = "bar2", version = 2, type = "B")
Thing.objects.create(name = "bar3", version = 3, type = "B")

Как мне написать один Django запрос, который даст мне одна запись для каждого типа type с самым высоким version? Итак, этот результат:

Queryset< Thing(name = "foo2", version = 2, type = "A"), 
Thing(name = "bar3", version = 3, type = "B") >

Я смотрел на документы здесь; https://docs.djangoproject.com/en/3.0/topics/db/aggregation/

И легко сделать что-то подобное;

Thing.objects.aggregate(Max('version'))

Но это дало бы мне Thing(name = "bar3", version = 3, type = "B")

1 Ответ

0 голосов
/ 10 марта 2020

Группирует по type и фильтрует по макс. version:

Things.objects.values('type').annotate(max_version=Max('version'))
...