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.

Вернуться на верх