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 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:

View File

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