From 7f575d53d17df6f1e6ade6e0bf6c06049c5a21ef Mon Sep 17 00:00:00 2001 From: Alban Gruin Date: Sun, 28 Jan 2018 21:16:42 +0100 Subject: Requête de liste des salles optimisée pour PostgreSQL --- views.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/views.py b/views.py index 842a02e..5ce9816 100644 --- a/views.py +++ b/views.py @@ -15,7 +15,10 @@ import datetime +from django.contrib.postgres.aggregates import ArrayAgg +from django.db import connection from django.db.models import Count, Max +from django.db.models.expressions import RawSQL from django.db.models.functions import ExtractWeek, ExtractYear, Length from django.http import Http404 from django.shortcuts import get_object_or_404, render @@ -117,6 +120,24 @@ def rooms(request): start, _ = get_week(*get_current_week()) end = start + datetime.timedelta(weeks=4) + if connection.vendor == "postgresql": + # Si le SGBD est PostgreSQL, on utilise une requête à base de + # ArrayAgg. Elle présente l’avantage d’être plus rapide que la + # requête « généraliste » et de ne pas nécessiter de + # traitement après. On récupère chaque salle ayant un cours + # dans le mois à venir. Pour chacun de ses cours, on ne + # récupère que le premier jour de la semaine, et si jamais ce + # jour n’est pas déjà dans la liste des semaines de cours + # (« weeks »), on l’y rajoute. + rooms = Room.objects.filter(course__begin__gte=start, + course__begin__lt=end) \ + .order_by("name") \ + .annotate(weeks=ArrayAgg( + RawSQL("date_trunc('week', edt_course.begin)", + []), distinct=True)) + + return render(request, "group_list.html", {"groups": rooms}) + # Récupération des salles et de toutes les semaines où elles sont # concernées. # Cette requête associe chaque salle à toutes les semaines où un -- cgit v1.2.1