From f59e868793dd27bd434dca0bc73ea991c159c6ec Mon Sep 17 00:00:00 2001 From: Basile Clement Date: Fri, 23 Oct 2020 22:37:03 +0200 Subject: [PATCH] Ajoute `get_queryset` dans `ModelSearch` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Quand on utilise les vues d'auto-complétion, on a la possibilité de configurer des filtres avec `get_queryset_filter`, mais pas d'autres transformations sur le queryset. Notamment, cela signifie que pour les vues qui utilisent des `ForeignKey`, on ne peut pas spécifier de `select_related` pour éviter des requêtes inutiles et répétées lors du rendering des vues. Ce patch ajoute une méthode `get_queryset`, en suivant la convention habituelle de Django, permettant cette configuration, et l'utilise pour appeler `select_related` de façon appropriée dans les vues qui en bénéficient. À priori, cela devrait permettre de compenser la potentielle perte de performance de !469, qui a supprimé les `select_related` lors de la sélection des participants. --- bda/views.py | 3 +++ kfet/autocomplete.py | 3 +++ shared/autocomplete.py | 8 ++++++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/bda/views.py b/bda/views.py index 1c54134e..a104bbb1 100644 --- a/bda/views.py +++ b/bda/views.py @@ -905,6 +905,9 @@ class ParticipantAutocomplete(Select2QuerySetView): model = Participant search_fields = ("user__username", "user__first_name", "user__last_name") + def get_queryset(self): + return super().get_queryset().select_related("user", "tirage") + participant_autocomplete = buro_required(ParticipantAutocomplete.as_view()) diff --git a/kfet/autocomplete.py b/kfet/autocomplete.py index 326c2796..cb222585 100644 --- a/kfet/autocomplete.py +++ b/kfet/autocomplete.py @@ -18,6 +18,9 @@ class KfetAccountSearch(autocomplete.ModelSearch): ] verbose_name = _("Comptes existants") + def get_queryset(self): + return super().get_queryset().select_related("profile__account_kfet") + def get_queryset_filter(self, *args, **kwargs): qset_filter = super().get_queryset_filter(*args, **kwargs) qset_filter &= Q(profile__account_kfet__isnull=False) diff --git a/shared/autocomplete.py b/shared/autocomplete.py index a601d5f9..2c85f25d 100644 --- a/shared/autocomplete.py +++ b/shared/autocomplete.py @@ -98,7 +98,11 @@ class ModelSearch(SearchUnit): def __init__(self): if self.verbose_name is None: - self.verbose_name = "{} search".format(self.model._meta.verbose_name) + model = self.get_queryset().model + self.verbose_name = "{} search".format(model._meta.verbose_name) + + def get_queryset(self): + return self.model.objects.all() def get_queryset_filter(self, keywords): filter_q = Q() @@ -122,7 +126,7 @@ class ModelSearch(SearchUnit): of the search fields. """ - return self.model.objects.filter(self.get_queryset_filter(keywords)) + return self.get_queryset().filter(self.get_queryset_filter(keywords)) # ---