Использование подзапроса для аннотирования графа несвязанной модели
Это может быть дубликат этого вопроса, но я не понял, возможно ли это или нет.
У меня есть две модели, которые не связаны между собой (или имеют вложенные отношения)
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, или это невозможно, будучи не связанным с моделями?