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):
|
||||
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):
|
||||
"""Employee model."""
|
||||
|
|
|
|||
|
|
@ -247,12 +247,18 @@ class EmployeeBackSerializers(serializers.ModelSerializer):
|
|||
|
||||
def get_public_mark(self, obj):
|
||||
"""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)
|
||||
if qs:
|
||||
return qs.public_mark
|
||||
return None
|
||||
|
||||
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)
|
||||
if qs:
|
||||
return qs.toque_number
|
||||
|
|
@ -260,6 +266,11 @@ class EmployeeBackSerializers(serializers.ModelSerializer):
|
|||
|
||||
def get_positions(self, obj):
|
||||
"""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)
|
||||
|
||||
if not est_id:
|
||||
|
|
@ -275,6 +286,11 @@ class EmployeeBackSerializers(serializers.ModelSerializer):
|
|||
|
||||
def get_establishment(self, obj):
|
||||
"""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)
|
||||
|
||||
if not est:
|
||||
|
|
|
|||
|
|
@ -174,21 +174,14 @@ class EmployeeListCreateView(generics.ListCreateAPIView):
|
|||
permission_classes = (permissions.AllowAny,)
|
||||
filter_class = filters.EmployeeBackFilter
|
||||
serializer_class = serializers.EmployeeBackSerializers
|
||||
queryset = models.Employee.objects.all().prefetch_related(
|
||||
'establishmentemployee_set',
|
||||
'establishmentemployee_set__establishment',
|
||||
'awards',
|
||||
)
|
||||
queryset = models.Employee.objects.all().with_back_office_related()
|
||||
|
||||
|
||||
class EmployeesListSearchViews(generics.ListAPIView):
|
||||
"""Employee search view"""
|
||||
pagination_class = None
|
||||
permission_classes = (permissions.AllowAny,)
|
||||
queryset = models.Employee.objects.all().prefetch_related(
|
||||
'establishmentemployee_set',
|
||||
'establishmentemployee_set__establishment',
|
||||
).select_related('photo')
|
||||
queryset = models.Employee.objects.all().with_back_office_related().select_related('photo')
|
||||
filter_class = filters.EmployeeBackSearchFilter
|
||||
serializer_class = serializers.EmployeeBackSerializers
|
||||
|
||||
|
|
@ -207,7 +200,7 @@ class EstablishmentEmployeeListView(generics.ListCreateAPIView):
|
|||
class EmployeeRUDView(generics.RetrieveUpdateDestroyAPIView):
|
||||
"""Employee RUD view."""
|
||||
serializer_class = serializers.EmployeeBackSerializers
|
||||
queryset = models.Employee.objects.all()
|
||||
queryset = models.Employee.objects.all().with_back_office_related()
|
||||
|
||||
|
||||
class EstablishmentTypeListCreateView(generics.ListCreateAPIView):
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user