some optimize for employee list

This commit is contained in:
alex 2020-01-17 16:02:00 +03:00
parent abfd4d7288
commit a8ea238bfc
2 changed files with 26 additions and 12 deletions

View File

@ -1,3 +1,6 @@
from functools import lru_cache
from django.db.models import F
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
@ -232,21 +235,32 @@ class EmployeeBackSerializers(serializers.ModelSerializer):
toque_number = serializers.SerializerMethodField() toque_number = serializers.SerializerMethodField()
photo = ImageBaseSerializer(source='crop_image', read_only=True) 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): def get_public_mark(self, obj):
"""Get last list actual public_mark""" """Get last list actual public_mark"""
qs = obj.establishmentemployee_set.actual().order_by('-from_date') \ qs = self.get_qs(obj)
.values('establishment__public_mark').first() if qs:
return qs['establishment__public_mark'] if qs else None return qs.public_mark
return None
def get_toque_number(self, obj): def get_toque_number(self, obj):
qs = obj.establishmentemployee_set.actual().order_by('-from_date') \ qs = self.get_qs(obj)
.values('establishment__toque_number').first() if qs:
return qs['establishment__toque_number'] if qs else None return qs.toque_number
return None
def get_positions(self, obj): def get_positions(self, obj):
"""Get last list actual positions""" """Get last list actual positions"""
est_id = obj.establishmentemployee_set.actual(). \ est_id = self.get_qs(obj)
order_by('-from_date').first()
if not est_id: if not est_id:
return None return None
@ -261,15 +275,14 @@ class EmployeeBackSerializers(serializers.ModelSerializer):
def get_establishment(self, obj): def get_establishment(self, obj):
"""Get last actual establishment""" """Get last actual establishment"""
est = obj.establishmentemployee_set.actual().order_by('-from_date') \ est = self.get_qs(obj)
.first()
if not est: if not est:
return None return None
return { return {
"id": est.establishment.id, "id": est.est_id,
"slug": est.establishment.slug "slug": est.est_slug
} }
class Meta: class Meta:

View File

@ -177,6 +177,7 @@ class EmployeeListCreateView(generics.ListCreateAPIView):
queryset = models.Employee.objects.all().prefetch_related( queryset = models.Employee.objects.all().prefetch_related(
'establishmentemployee_set', 'establishmentemployee_set',
'establishmentemployee_set__establishment', 'establishmentemployee_set__establishment',
'awards',
) )