How to group by and get latest record in group contain all of fields in Django?

Question:

Imagine we have a table like this:

id name type created_at
1 James male 2022-03-02
2 Jane female 2022-04-02
3 Kirk male 2022-03-04
4 Sarah female 2022-04-04
5 Jason male 2022-03-05

And i want to group by type and just get latest records based on created_at.
So i tried this code and not bad:

result = User.objects.values('type').annotate(
            latest_date=Max('created_at'),
) 

When print the result i face to this:

<QuerySet [
{'type': 'male', 'latest_date': '2022-03-05'}, 
{'type': 'female', 'latest_date': '2022-04-04'}
]>

My question is: Where is other fields id and name?
I expect to get:

<QuerySet [
{id: 5, name: 'Jason', 'type': 'male', 'latest_date': '2022-03-05'}, 
{id: 4, name: 'Sarah', 'type': 'female', 'latest_date': '2022-04-04'}
]>
Asked By: reza_khalafi

||

Answers:

Use order_by with distinct

User.objects.order_by("type", "-created_at").distinct("type")

this might help you

result = User.objects.values('type').annotate(
                latest_date=Max('created_at'),
    ).values('id','name','type','latest_date')
Answered By: nava