Как я могу получить последнюю запись по набору запросов. Например, группировка по
Data
name | data1 | data2 | create_date |
---|---|---|---|
железный человек | ia | ib | 1630000000 |
hulk | ha | hb | 1630000000 |
hulk | hc | hd | 1630500000 |
капитан | ca | cb | 1630000000 |
капитан | cc | cd | 1630500000 |
капитан | ce | cf | 1630590000 |
Я хочу получить последние данные по каждому имени
name | data1 | data2 | create_date |
---|---|---|---|
железный человек | ia | ib | 1630000000 |
hulk | hc | hd | 1630500000 |
капитан | ce | cf | 1630590000 |
подобно этому
wish_data = [
{'name':'iron man', 'data1': 'ia', 'data2': 'ib', 'create_date':1630000000},
{'name':'hulk', 'data1': 'hc', 'data2': 'hd', 'create_date':1630500000},
{'name':'captain', 'data1': 'ce', 'data2': 'cf', 'create_date':1630590000},
]
Я пытался...
Model.objects.filter(**conditions).values_list('name').annotate(cdate=Max('create_date'))
=> [('iron man', 1630000000), ('hulk', 1630500000), ('captain', 1630590000)]>
но мне нужны другие колонки...
Q
Возможно ли это с помощью ORM? Или я должен написать логику с помощью операторов for и if?
Да, это возможно. Вы можете использовать distinct
и order_by
вместе в запросе django orm, чтобы получить wish_data
. Запрос будет выглядеть примерно так:
distict_avengers = Model.objects.filter(**conditions).distinct("name").order_by("name", "-create_date").values("name", "data1", "data2", "create_date")
Если вы сделаете print(distict_avengers)
, то увидите следующий результат:
[
{"name": "captain", "data1": "ce", "data2": "cf", "create_date": 1630590000},
{"name": "hulk", "data1": "hc", "data2": "hd", "create_date": 1630500000},
{"name": "iron man", "data1": "ia", "data2": "ib", "create_date": 1630000000},
]
Обратите внимание, что использование distinct на полях не поддерживается в SQLite, а также при использовании distinct
и order_by
вместе поля, указанные в order_by
всегда должны начинаться с полей, указанных в distinct
.