В Django, как я могу получить все самые последние версии моих объектов? - PullRequest
1 голос
/ 19 сентября 2011

Допустим, я моделирую VCS с помощью Django, используя такую ​​модель:

class VCSItem(models.Model):
    directory = models.CharField()
    name = models.CharField()
    revision = models.IntegerField()

Теперь (каталог, имя) однозначно идентифицируют элемент, отслеживаемый моей системой, но каждый элемент может иметь несколькоизменения.

Я бы хотел перечислить все элементы, где у каждого элемента есть максимальная отслеживаемая ревизия для моей системы.Имеет ли Django встроенную функциональность для этого?

В худшем случае, я мог бы сделать это самостоятельно с чем-то вроде:

newest_items = {}
for item in VCSItem.objects.all().order_by("revision"):
    newest_item[item.directory + item.name] = item

Недостатком является то, что мне нужно получить все записи избазу данных и цикл по каждому - то, что я бы предпочел избежать, если это возможно.

1 Ответ

1 голос
/ 19 сентября 2011

взгляните на аннотации и функцию агрегации Max: https://docs.djangoproject.com/en/dev/ref/models/querysets/#annotate https://docs.djangoproject.com/en/dev/ref/models/querysets/#max

VCSItem.objects.values('directory', 'name').annotate(max_rev=Max('revision'))
...