Если достаточно иметь только экземпляр Swallow и только , то дата последней миграции будет достаточной для вас:
Swallow.objects.annotate(latest_migration=Max('swallowmigration__date'))
Каждый экземпляр Swallow из полученногоqueryset будет иметь атрибут «latest_migration», который будет максимальным значением datetime для связанных объектов.
Если вам нужен экземпляр SwallowMigration, он будет стоить вам N + 1 запросов, где N - количествоГлотать экземпляры.Что-то вроде следующего будет делать для вас, хотя у вас будут объекты SwallowMigration с предварительно выбранным экземпляром Swallow вместо каждого наоборот.Нетрудно обработать список и обратить его обратно, установив экземпляр SwallowMigration в качестве атрибута экземпляра Swallow.
qs = SwallowMigration.objects.values(
'swallow_id'
).annotate(
latest_migration=Max('date')
)
migrations = []
for vals in qs:
sm = SwallowMigration.objects.select_related(
'swallow'
).get(
swallow=vals['swallow_id'],
date=vals['date'],
)
migrations.append(sm)
Может быть (возможно, есть) способ вернуть все данныеВы хотите в одном запросе, но это должен быть необработанный SQL, и вам придется либо использовать данные из этого как есть, либо создать из них экземпляры модели.
Если этот код будет выполнятьсячасто может стоить добавить внешний ключ на Swallow в последнюю версию SwallowMigration, чтобы вы могли легко получить их в одном запросе с помощью select_related ().Вам просто нужно следить за тем, чтобы внешний ключ обновлялся при добавлении новых экземпляров SwallowMigration.