From b8c2792f0a92afa23619e7596ab06737dd64fe25 Mon Sep 17 00:00:00 2001 From: Adam Goldsmith Date: Wed, 17 Jan 2024 13:25:37 -0500 Subject: [PATCH] membershipworks: Convert EventExt.duration annotation to a Subquery should be somewhat less performant, but allows for easier aggregation --- membershipworks/models.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/membershipworks/models.py b/membershipworks/models.py index db02c97..e4002e8 100644 --- a/membershipworks/models.py +++ b/membershipworks/models.py @@ -4,7 +4,7 @@ from datetime import datetime import django.core.mail.message from django.conf import settings from django.db import models -from django.db.models import Exists, F, OuterRef, Sum +from django.db.models import Exists, F, OuterRef, Subquery, Sum from django.utils import timezone @@ -415,7 +415,19 @@ class EventInstructor(models.Model): class EventExtManager(models.Manager["EventExt"]): def get_queryset(self) -> models.QuerySet["EventExt"]: - return super().get_queryset().annotate(duration=Sum("meeting_times__duration")) + return ( + super() + .get_queryset() + .annotate( + duration=Subquery( + EventMeetingTime.objects.filter(event=OuterRef("pk")) + .values("event__pk") + .annotate(d=Sum("duration")) + .values("d")[:1], + output_field=models.DurationField(), + ), + ) + ) class EventExt(Event):