Требование первичного ключа в необработанном SQL усложняет запрос в Django

Чтобы получить максимальное значение из простой таблицы значений, я могу написать следующий запрос в Django:

MyTable.objects.aggregate(Max('value'))

Сгенерированный SQL:'SELECT MAX("mytable"."value") AS "value__max" FROM "mytable"'

Теперь, если я пишу тот же SQL с помощью менеджера необработанных запросов:

1. MyTable.objects.raw('SELECT max(value) FROM mytable')

Джанго выдает ошибкуInvalidQuery: Raw query must include the primary key, Это также упоминается в Django docs: «Есть только одно поле, которое вы не можете пропустить - поле первичного ключа». Итак, после добавленияid поле мне нужноGROUP BY также. Новый запрос становится:

2. MyTable.objects.raw('SELECT id, max(value) FROM mytable GROUP BY id')

Это больше не дает мне ни одного максимального значения, потому что я вынужден использоватьGROUP BY id, Теперь мне нужно добавитьORDER BY а такжеLIMIT заявление, чтобы получить ожидаемый ответ для в противном случае простого оператора SQL, который работает.

3. MyTable.objects.raw('SELECT id, max(value) AS mv FROM mytable GROUP BY id ORDER BY mv DESC LIMIT 1')

Есть ли способ упростить вышеуказанный запрос, то есть не использовать ORDER / LIMIT / GROUP BY (FWIW, используя PosgreSQL)?

Обновить:

Вот взлом, который будет работать. Я псевдоним максимальное значение какid сделать Джанго счастливым. Есть ли здесь какая-то проблема?

MyTable.objects.raw('SELECT max(value) AS id FROM mytable')

Обновление 2:

Вот план запроса для простого SQL (1) против сложного финального (3):

"Aggregate  (cost=5.25..5.26 rows=1 width=2) (actual time=0.155..0.155 rows=1 loops=1)"
"  ->  Seq Scan on mytable  (cost=0.00..4.60 rows=260 width=2) (actual time=0.018..0.067 rows=260 loops=1)"
"Total runtime: 0.222 ms"


"Limit  (cost=9.80..9.80 rows=1 width=6) (actual time=0.548..0.548 rows=1 loops=1)"
"  ->  Sort  (cost=9.80..10.45 rows=260 width=6) (actual time=0.545..0.545 rows=1 loops=1)"
"        Sort Key: (max(value))"
"        Sort Method: top-N heapsort  Memory: 25kB"
"        ->  HashAggregate  (cost=5.90..8.50 rows=260 width=6) (actual time=0.328..0.432 rows=260 loops=1)"
"              ->  Seq Scan on mytable  (cost=0.00..4.60 rows=260 width=6) (actual time=0.018..0.069 rows=260 loops=1)"
"Total runtime: 0.638 ms"

Постскриптум Фактический запрос является более сложным (в некоторой степени связан с этим ответом:https://dba.stackexchange.com/a/86404/52114)

Ответы на вопрос(3)

Ваш ответ на вопрос