optimize db queries on /api/back/establishments/employees
This commit is contained in:
parent
d8a3e744e1
commit
a05db696b0
|
|
@ -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."""
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user