From 54e4205ea7468e6d1f2a1f72c373c5b0125e5325 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Tue, 1 Aug 2017 14:48:01 +0200 Subject: [PATCH] optimize database queries with annotation --- cfp/models.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/cfp/models.py b/cfp/models.py index 3edbcab..02dc37f 100644 --- a/cfp/models.py +++ b/cfp/models.py @@ -8,7 +8,7 @@ from django.contrib.sites.models import Site from django.core.urlresolvers import reverse from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models -from django.db.models import Q, Avg +from django.db.models import Q, Avg, Case, When from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext from django.utils import timezone @@ -212,6 +212,13 @@ class TalkCategory(models.Model): # type of talk (conf 30min, 1h, stand, …) # return join(talk.site.name, talk.slug, filename) +class TalkManager(models.Manager): + def get_queryset(self): + qs = super().get_queryset() + qs = qs.annotate(score=Case(When(vote=None, then=0), default=Avg('vote__vote'))) + return qs + + class Talk(PonyConfModel): LICENCES = ( @@ -248,6 +255,9 @@ class Talk(PonyConfModel): token = models.UUIDField(default=uuid.uuid4, editable=False) + objects = TalkManager() + + class Meta: ordering = ('title',) @@ -270,9 +280,6 @@ class Talk(PonyConfModel): def get_absolute_url(self): return reverse('talk-details', kwargs={'talk_id': self.token}) - def score(self): - return self.vote_set.aggregate(Avg('vote'))['vote__avg'] or 0 - @property def end_date(self): if self.estimated_duration: