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 | |
| parent | e815411b1d10ba0c94fa19a942033957a341f3fc (diff) | |
Requête de liste des salles optimisée pour PostgreSQL
| -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  | 
