Использование подзапроса для аннотирования графа несвязанной модели

Это может быть дубликат этого вопроса, но я не понял, возможно ли это или нет.

У меня есть две модели, которые не связаны между собой (или имеют вложенные отношения)

class Cycle(models.Model):

    start_date = models.DateField()
    end_date = models.DateField()

class Event(models.Model)
    created_at = models.DateField()

Я хочу отфильтровать текущий цикл и аннотировать количество событий, которые были созданы между циклами start_date и end_date, все в одном запросе.

Что у меня есть на данный момент:

now = timezone.now()

number_events = Event.objects\
            .filter(created_at__gte=OuterRef('start_date'), created_at__lte=OuterRef('end_date'))

cycle = Cycle.objects \
            .filter(start_date__lte=now, end_date__gte=now) \
            .annotate(number_events=Count(number_events)) \
            .first()

Это создает неправильный синтаксис, говорящий subquery must return only one column

Если я добавляю values("id") в запрос number_events, то возникает more than one row returned by a subquery used as an expression

Если я добавляю values("id")[:1], то он работает, но считает только одно событие

А если я попытаюсь выполнить запрос в SQL, то смогу получить данные

SELECT *,
       (select COUNT(*) AS "number_events"
        FROM "events_event" U0
        WHERE (U0."created_at" >= "cycles_cycle"."start_date" AND
               U0."created_at" <= "cycles_cycle"."valid_until"))
FROM "cycles_cycle"
WHERE ("cycles_cycle"."start_date" <= '2022-06-01' AND
       "cycles_cycle"."end_date" >= '2022-06-01')
GROUP BY "cycles_cycle"."id"
limit 1;

Есть ли способ создать такой запрос в django, или это невозможно, будучи не связанным с моделями?

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