У меня есть версионная модель, которая (упрощенный) выглядит как:Что такое способ django делать подзаголовок?
Project(id, ref, version)
unique_together(ref, version)
Где идентификатор является автоматически генерируемым первичным ключом, исм является случайным UUID и версия представляет собой целое число увеличивается на моем приложении. Каждый раз, когда я сохраняю проект, я создаю новый экземпляр, добавляю 1 к версии и копирую ссылку на новый объект.
Следующий SQL вернет мне последнюю версию каждого проекта, выполнив подзапрос.
SELECT * FROM myapp_project WHERE (ref, version) IN
(SELECT ref, max(version) FROM myapp_project GROUP BY ref)
В качестве альтернативы (немного проще, возможно):
SELECT * from myapp_project p
WHERE p.version =
(SELECT max(version) FROM myapp_project p1 WHERE p1.ref = p.ref)
Как достичь того же запроса с помощью ORM Джанго?
Edit: я дошел до этого -
foo = Project.objects.values('ref').annotate(version=Max('version'))
Это дает мне то, что выглядит хорошо, если я проверить его. Как только я пытаюсь получить идентификатор с:
foo.values('id')
кажется, выбросите исходный результат и возвращает все строки.
Редактировать больше:
работал вокруг него сейчас с .extra():
maxids = """id in (SELECT id from myapp_project p WHERE p.version =
(SELECT max(version) FROM myapp_project p1 WHERE p1.ref = p.ref))"""
Project.objects.all().extra(where=[maxids])
оффтоп: с точки зрения производительности, большинство запросов будет до последней версии проектов, так что имеет смысл sligthly изменить свой подход и иметь ваш последние версии отмечены как-то. Есть несколько вариантов, самый простой - иметь None в качестве последней версии, поэтому вы можете выбрать все проекты с нулевой версией для получения последних версий, версия будет обновлена при добавлении новой версии проекта или добавлении некоторого флага '- в любом случае простой фильтр предоставит вам список последних версий - большой выигрыш по производительности – Jerzyk