optimize db queries on /api/back/establishments/employees

This commit is contained in:
Kuroshini 2020-01-17 19:08:15 +03:00
parent d8a3e744e1
commit a05db696b0
3 changed files with 28 additions and 10 deletions

View File

@ -1063,6 +1063,15 @@ class EmployeeQuerySet(models.QuerySet):
def with_extended_related(self): def with_extended_related(self):
return self.prefetch_related('establishments') return self.prefetch_related('establishments')
def with_back_office_related(self):
return self.prefetch_related(
Prefetch('establishmentemployee_set',
queryset=EstablishmentEmployee.objects.actual()
.prefetch_related('establishment', 'position').order_by('-from_date'),
to_attr='prefetched_establishment_employee'),
'awards'
)
class Employee(BaseAttributes): class Employee(BaseAttributes):
"""Employee model.""" """Employee model."""

View File

@ -247,12 +247,18 @@ class EmployeeBackSerializers(serializers.ModelSerializer):
def get_public_mark(self, obj): def get_public_mark(self, obj):
"""Get last list actual public_mark""" """Get last list actual public_mark"""
if hasattr(obj, 'prefetched_establishment_employee'):
return obj.prefetched_establishment_employee[0].establishment.public_mark if len(
obj.prefetched_establishment_employee) else None
qs = self.get_qs(obj) qs = self.get_qs(obj)
if qs: if qs:
return qs.public_mark return qs.public_mark
return None return None
def get_toque_number(self, obj): def get_toque_number(self, obj):
if hasattr(obj, 'prefetched_establishment_employee'):
return obj.prefetched_establishment_employee[0].establishment.toque_number if len(
obj.prefetched_establishment_employee) else None
qs = self.get_qs(obj) qs = self.get_qs(obj)
if qs: if qs:
return qs.toque_number return qs.toque_number
@ -260,6 +266,11 @@ class EmployeeBackSerializers(serializers.ModelSerializer):
def get_positions(self, obj): def get_positions(self, obj):
"""Get last list actual positions""" """Get last list actual positions"""
if hasattr(obj, 'prefetched_establishment_employee'):
if not len(obj.prefetched_establishment_employee):
return []
return [PositionBackSerializer(ee.position).data for ee in obj.prefetched_establishment_employee]
est_id = self.get_qs(obj) est_id = self.get_qs(obj)
if not est_id: if not est_id:
@ -275,6 +286,11 @@ class EmployeeBackSerializers(serializers.ModelSerializer):
def get_establishment(self, obj): def get_establishment(self, obj):
"""Get last actual establishment""" """Get last actual establishment"""
if hasattr(obj, 'prefetched_establishment_employee'):
return {
'id': obj.prefetched_establishment_employee[0].establishment.pk,
'slug': obj.prefetched_establishment_employee[0].establishment.slug,
} if len(obj.prefetched_establishment_employee) else None
est = self.get_qs(obj) est = self.get_qs(obj)
if not est: if not est:

View File

@ -174,21 +174,14 @@ class EmployeeListCreateView(generics.ListCreateAPIView):
permission_classes = (permissions.AllowAny,) permission_classes = (permissions.AllowAny,)
filter_class = filters.EmployeeBackFilter filter_class = filters.EmployeeBackFilter
serializer_class = serializers.EmployeeBackSerializers serializer_class = serializers.EmployeeBackSerializers
queryset = models.Employee.objects.all().prefetch_related( queryset = models.Employee.objects.all().with_back_office_related()
'establishmentemployee_set',
'establishmentemployee_set__establishment',
'awards',
)
class EmployeesListSearchViews(generics.ListAPIView): class EmployeesListSearchViews(generics.ListAPIView):
"""Employee search view""" """Employee search view"""
pagination_class = None pagination_class = None
permission_classes = (permissions.AllowAny,) permission_classes = (permissions.AllowAny,)
queryset = models.Employee.objects.all().prefetch_related( queryset = models.Employee.objects.all().with_back_office_related().select_related('photo')
'establishmentemployee_set',
'establishmentemployee_set__establishment',
).select_related('photo')
filter_class = filters.EmployeeBackSearchFilter filter_class = filters.EmployeeBackSearchFilter
serializer_class = serializers.EmployeeBackSerializers serializer_class = serializers.EmployeeBackSerializers
@ -207,7 +200,7 @@ class EstablishmentEmployeeListView(generics.ListCreateAPIView):
class EmployeeRUDView(generics.RetrieveUpdateDestroyAPIView): class EmployeeRUDView(generics.RetrieveUpdateDestroyAPIView):
"""Employee RUD view.""" """Employee RUD view."""
serializer_class = serializers.EmployeeBackSerializers serializer_class = serializers.EmployeeBackSerializers
queryset = models.Employee.objects.all() queryset = models.Employee.objects.all().with_back_office_related()
class EstablishmentTypeListCreateView(generics.ListCreateAPIView): class EstablishmentTypeListCreateView(generics.ListCreateAPIView):