DJANGO : Как отфильтровать последние данные, собранные для каждого типа объекта в модели?

Допустим, у меня есть такая модель

class TreeCensus(models.Model):

    name            = models.CharField() #Oak, elm, ...
    identified_at   = models.DateTimeField(auto_now_add=True)

Я хочу получить QS с последней переписью каждого дерева.

Я наивно попробовал это

TreeCensus.object.order_by('name').last()

Но очевидно, что он вернул мне последний из всех объектов TreeCensus.

Итак, какой лучший способ (или хотя бы хороший) для этого? Например, если в QS есть 2 Oak, я хочу, чтобы первый был отфильтрован

Вы можете .annotate(…) [Django-doc] с:

from django.db.models import Max

TreeCensus.objects.values('name').annotate(
    last_seen=Max('identified_at')
).order_by('name')

Это создаст QuerySet словарей с name и last_seen в качестве ключей, где last_seen будет содержать наибольшую (последнюю) временную метку для данного name.

Вернуться на верх