Django: присоединение к подзапросу без модели
Я хочу создать запрос, который присоединяется к функции Postgres generate_series(), чтобы заполнить пустые интервалы дат из запроса.
По сути, у меня есть запрос следующего содержания:
Select
(case
when DATE_TRUNC('week', foobar.date_key) is not null
then DATE_TRUNC('week', foobar.date_key) else
date.date end
) as "x_axis_time"
from foobar
left join (
select
DATE_TRUNC(
'week',
generate_series(
some_start_date,
some_end_date,
'1 week'::interval
) AT TIME ZONE 'UTC')
as "date"
)
Это создает набор результатов, который содержит запись для каждой недели между двумя датами, с пустыми датами из FooBar, заполненными левым соединением на DATE_TRUNC
Я хотел бы сделать нечто подобное в Django. У меня есть функция для создания левого соединения (подзапроса), что довольно легко сделать, но что у меня вызывает трудности, так это создание модели, которая может генерировать нужный SQL для select date_trunc(....
).Django Date_Trunc выглядит следующим образом:
join_subquery = Trunc(
GenerateSeries(
Cast(Value(datetime_start), output_field=DateTimeField()),
Cast(Value(datetime_end), output_field=DateTimeField()),
Cast(Value('1 week'), output_field=DurationField()),
output_field=DateTimeField()
),
'week',
output_field=DateTimeField()
)
где GenerateSeries: class GenerateSeries(Func): function = 'generate_series'
def as_postgresql(self, compiler, connection, **extra_context):
return super().as_sql(
compiler, connection,
function=self.function,
template="%(function)s('%(expressions)s)",
**extra_context
)
Однако это не совсем работает, потому что это просто Func, а не Queryset. Есть ли способ создать модель, которая генерирует sql, необходимый для этого? Все модели добавляют select id from x к запросу, поэтому это нарушает SQL.