Я пытаюсь добиться некоторого дополнительного выбора в наборе запросов и хочу добавить нужную таблицу в пул таблиц в запросе, используя метод select_related, чтобы воспользоваться синтаксисом __.
Вот пример с простыми моделями:
from django.db import models
# Create your models here.
class testA(models.Model):
code = models.TextField(unique = True)
date = models.DateTimeField(auto_now_add = True)
class testB(models.Model):
text = models.TextField()
a = models.ForeignKey(testA)
А вот запрос, который я хочу построить:
SELECT (extract(hour from testa.date)) AS hour, testb.text FROM testb INNER JOIN testa ON (testb.a_id = testa.id)
Итак, вот как я собираю его в python:
testB.objects.all().select_related('a').extra(select = {'hour' : 'extract(hour from testa.date)'}).values('hour','text')
но django удаляет select_related, когда видит, что я не использую таблицу "testa" (из-за выражения 'values').Таким образом, полученный SQL-запрос завершается ошибкой:
SELECT (extract(hour from testa.date)) AS "hour", "testb"."text" FROM "testb"
Если я удаляю оператор «values», он работает нормально:
SELECT (extract(hour from testa.date)) AS "hour", "testb"."id", "testb"."text", "testb"."a_id", "testa"."id", "testa"."code", "testa"."date" FROM "testb" INNER JOIN "testa" ON ("testb"."a_id" = "testa"."id")
, но я должен поставить оператор values, как я хочу, чтобы составлять агрегатыкак в «подсчете объектов b, сгруппированных по часу даты в объекте a»:
testB.objects.all().select_related('a').extra(select = {'hour' : 'extract(hour from testa.date)'}).values('hour').annotate(count = Count('pk'))
Итак, каков хороший способ добиться этого?«Подсчитать объекты, сгруппированные по чему-то в другом объекте»?Или есть способ «заставить» django сохранить таблицы «select_related», даже если он считает, что они бесполезны?
PS: я знаю, что мог бы использовать аргумент «tables» дополнительного оператора, но в этомВ этом случае мне придется самостоятельно переписать объединение, и я хочу воспользоваться django ORM