Я делаю историю фильтров на Django с полями source_path
и target_path
, сохраненными в таблице Database. Нужно получить последние 5 фильтров, но разные
Пример:
Я сделал несколько наборов запросов, но неудачные результаты
LastFilterRoute.objects.filter(user=request.user).order_by('source_path', 'target_path').distinct('source_path', 'target_path')[:5]
Возвращает другие фильтры, но не последние
**Edit ** Я получил правильный запрос, но кажется слишком усложнее для выполнения в django
Было бы лучше, если бы я разделил его или сделал raw_query?
SELECT distinct c.name, c2.name, max(created)
FROM public.filter_route f
INNER JOIN cities_city c
ON f.source_path_id = c.id
INNER JOIN cities_city c2
ON f.target_path_id = c2.id
group by c.name, c2.name
ORDER BY max DESC
Есть ли лучший способ сделать это или чего мне не хватает?
Ну, я выяснил
Использовать GROUP BY
вместо distinct
и Max()
для последнего созданного запроса
LastFilterRoute.objects.filter(user=request.user).values('source_path__name', 'target_path__name').annotate(last=Max('created')).order_by('-last')[:5]
И запрос был
SELECT "cities_city"."name", T4."name",
MAX("filter_route"."created") AS "last"
FROM "filter_route"
INNER JOIN "cities_city"
ON ("filter_route"."source_path_id" = "cities_city"."id")
INNER JOIN "cities_city" T4 ON ("filter_route"."target_path_id" = T4."id")
WHERE "filter_route"."user_id" = 1
GROUP BY "cities_city"."name", T4."name"
ORDER BY "last"
DESC LIMIT 5