From a8ea238bfce9db6faaa917644d7501d848b633a6 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 17 Jan 2020 16:02:00 +0300 Subject: [PATCH] some optimize for employee list --- apps/establishment/serializers/back.py | 37 +++++++++++++++++--------- apps/establishment/views/back.py | 1 + 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/apps/establishment/serializers/back.py b/apps/establishment/serializers/back.py index a6246d47..8f9631f1 100644 --- a/apps/establishment/serializers/back.py +++ b/apps/establishment/serializers/back.py @@ -1,3 +1,6 @@ +from functools import lru_cache + +from django.db.models import F from django.utils.translation import gettext_lazy as _ from rest_framework import serializers @@ -232,21 +235,32 @@ class EmployeeBackSerializers(serializers.ModelSerializer): toque_number = serializers.SerializerMethodField() photo = ImageBaseSerializer(source='crop_image', read_only=True) + @staticmethod + @lru_cache(maxsize=32) + def get_qs(obj): + return obj.establishmentemployee_set.actual().annotate( + public_mark=F('establishment__public_mark'), + est_id=F('establishment__id'), + est_slug=F('establishment__slug'), + toque_number=F('establishment__toque_number'), + ).order_by('-from_date').first() + def get_public_mark(self, obj): """Get last list actual public_mark""" - qs = obj.establishmentemployee_set.actual().order_by('-from_date') \ - .values('establishment__public_mark').first() - return qs['establishment__public_mark'] if qs else None + qs = self.get_qs(obj) + if qs: + return qs.public_mark + return None def get_toque_number(self, obj): - qs = obj.establishmentemployee_set.actual().order_by('-from_date') \ - .values('establishment__toque_number').first() - return qs['establishment__toque_number'] if qs else None + qs = self.get_qs(obj) + if qs: + return qs.toque_number + return None def get_positions(self, obj): """Get last list actual positions""" - est_id = obj.establishmentemployee_set.actual(). \ - order_by('-from_date').first() + est_id = self.get_qs(obj) if not est_id: return None @@ -261,15 +275,14 @@ class EmployeeBackSerializers(serializers.ModelSerializer): def get_establishment(self, obj): """Get last actual establishment""" - est = obj.establishmentemployee_set.actual().order_by('-from_date') \ - .first() + est = self.get_qs(obj) if not est: return None return { - "id": est.establishment.id, - "slug": est.establishment.slug + "id": est.est_id, + "slug": est.est_slug } class Meta: diff --git a/apps/establishment/views/back.py b/apps/establishment/views/back.py index 578f6b6a..f98747b6 100644 --- a/apps/establishment/views/back.py +++ b/apps/establishment/views/back.py @@ -177,6 +177,7 @@ class EmployeeListCreateView(generics.ListCreateAPIView): queryset = models.Employee.objects.all().prefetch_related( 'establishmentemployee_set', 'establishmentemployee_set__establishment', + 'awards', )