diff options
author | Alban Gruin | 2018-01-28 21:16:42 +0100 |
---|---|---|
committer | Alban Gruin | 2018-01-28 21:16:42 +0100 |
commit | 7f575d53d17df6f1e6ade6e0bf6c06049c5a21ef (patch) | |
tree | a59b4fac3d24cebde6e7207a2fbac3f3a56d888c /views.py | |
parent | e815411b1d10ba0c94fa19a942033957a341f3fc (diff) |
Requête de liste des salles optimisée pour PostgreSQL
Diffstat (limited to 'views.py')
-rw-r--r-- | views.py | 21 |
1 files changed, 21 insertions, 0 deletions
@@ -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 |