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'}
]>
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')
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'}
]>
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')