From 85f40b358a3ad1d2f8c0e7be8a968f0e3e8ed176 Mon Sep 17 00:00:00 2001 From: Arona Jones Date: Thu, 29 Jul 2021 22:49:27 +0100 Subject: [PATCH] Some attempts at optimising SQL queries New high score! --- training/models.py | 13 ++++++++----- training/templates/trainee_detail.html | 10 +++++++++- training/urls.py | 1 + training/views.py | 12 ++++++++++++ 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/training/models.py b/training/models.py index 00cb4b2b..674d3776 100644 --- a/training/models.py +++ b/training/models.py @@ -10,12 +10,12 @@ class Trainee(Profile): @property def is_supervisor(self): - for level_qualification in self.levels.all(): + for level_qualification in self.levels.select_related('level').all(): if confirmed_on is not None and level_qualification.level.level >= TrainingLevel.SUPERVISOR: return True def get_records_of_depth(self, depth): - return self.qualifications_obtained.filter(depth=depth) + return self.qualifications_obtained.filter(depth=depth).select_related('item', 'trainee', 'supervisor') def is_user_qualified_in(self, item, required_depth): qual = self.qualifications_obtained.filter(item=item).first() # this is a somewhat ghetto version of get_or_none @@ -42,7 +42,7 @@ class TrainingItem(models.Model): @staticmethod def user_has_qualification(item, user, depth): - for q in user.qualifications_obtained.all(): + for q in user.qualifications_obtained.all().select_related('item'): if q.item == item and q.depth > depth: return True @@ -113,7 +113,7 @@ class TrainingLevel(models.Model, RevisionMixin): return self.get_requirements_of_depth(TrainingItemQualification.PASSED_OUT) def percentage_complete(self, user): # FIXME - needed_qualifications = self.requirements.all() + needed_qualifications = self.requirements.all().select_related() relavant_qualifications = 0.0 # TODO Efficiency... for req in needed_qualifications: @@ -126,7 +126,7 @@ class TrainingLevel(models.Model, RevisionMixin): return 0 def user_has_requirements(self, user): - return all(TrainingItem.user_has_qualification(req.item, user, req.depth) for req in self.requirements.all()) + return all(TrainingItem.user_has_qualification(req.item, user, req.depth) for req in self.requirements.select_related().all()) def __str__(self): if self.department is None: # 2TA @@ -149,3 +149,6 @@ class TrainingLevelQualification(models.Model): level = models.ForeignKey('TrainingLevel', on_delete=models.RESTRICT) confirmed_on = models.DateTimeField(null=True) confirmed_by = models.ForeignKey('Trainee', related_name='confirmer', on_delete=models.RESTRICT, null=True) + + def __str__(self): + return "{} qualified as a {}".format(self.trainee, self.level) diff --git a/training/templates/trainee_detail.html b/training/templates/trainee_detail.html index ab838696..9ea9ee3b 100644 --- a/training/templates/trainee_detail.html +++ b/training/templates/trainee_detail.html @@ -50,7 +50,15 @@