2011-09-18 1 views
1

Допустим, я моделирования VCS с Django, используя модель что-то вроде этого:В 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

посмотреть на аннотации и 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')) 
+0

Этот подход не возвращает полный объект, но Dict, содержащий 'directory',' name' и 'max_rev'. Есть ли гладкий способ получить весь объект? –

 Смежные вопросы

  • Нет связанных вопросов^_^