Browse Source

fix: optimize queryset in CourseListAPIView with select_related and improved filtering

master
mortezaei 11 months ago
parent
commit
a2efd6e354
  1. 30
      apps/course/views/course.py

30
apps/course/views/course.py

@ -33,15 +33,6 @@ class CourseListAPIView(ListAPIView):
filter_backends = [SearchFilter] filter_backends = [SearchFilter]
search_fields = ['title', 'category__name', 'professor__fullname'] search_fields = ['title', 'category__name', 'professor__fullname']
def get_queryset(self):
"""
Optimized queryset with select_related for ForeignKey relationships
"""
return Course.objects.select_related(
'category',
'professor'
).exclude(status=Course.StatusChoices.INACTIVE)
@swagger_auto_schema( @swagger_auto_schema(
operation_description=doc_course_list(), operation_description=doc_course_list(),
manual_parameters=[ manual_parameters=[
@ -59,7 +50,7 @@ class CourseListAPIView(ListAPIView):
openapi.Parameter( openapi.Parameter(
'status', openapi.IN_QUERY, 'status', openapi.IN_QUERY,
type=openapi.TYPE_STRING, type=openapi.TYPE_STRING,
description="""Status =>
description="""Status =>
Upcoming (visible but registration not allowed)---Предстоящие Upcoming (visible but registration not allowed)---Предстоящие
Registering (registration is open)---регистрация Registering (registration is open)---регистрация
Ongoing (course has started, registration closed)---Впроцессе Ongoing (course has started, registration closed)---Впроцессе
@ -79,13 +70,20 @@ class CourseListAPIView(ListAPIView):
), ),
]) ])
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
return super().get(request, *args, **kwargs)
return super().get(request, *args, **kwargs)
def get_queryset(self): def get_queryset(self):
queryset = super().get_queryset()
"""
Optimized queryset with select_related for ForeignKey relationships and filtering
"""
queryset = Course.objects.select_related(
'category',
'professor'
).exclude(status=Course.StatusChoices.INACTIVE)
request = self.request request = self.request
filters = request.query_params filters = request.query_params
# Handle category_slug with multiple values separated by commas # Handle category_slug with multiple values separated by commas
if category_slugs := filters.get('category_slug'): if category_slugs := filters.get('category_slug'):
category_slugs_list = category_slugs.split(',') category_slugs_list = category_slugs.split(',')
@ -95,7 +93,7 @@ class CourseListAPIView(ListAPIView):
if statuses := filters.get('status'): if statuses := filters.get('status'):
statuses_list = statuses.split(',') statuses_list = statuses.split(',')
queryset = queryset.filter(status__in=statuses_list) queryset = queryset.filter(status__in=statuses_list)
if is_free := filters.get('is_free'): if is_free := filters.get('is_free'):
is_free = is_free.lower() == 'true' is_free = is_free.lower() == 'true'
queryset = queryset.filter( queryset = queryset.filter(
@ -104,7 +102,7 @@ class CourseListAPIView(ListAPIView):
if is_online := filters.get('is_online'): if is_online := filters.get('is_online'):
is_online = is_online.lower() == 'true' is_online = is_online.lower() == 'true'
queryset = queryset.filter(is_online=is_online) queryset = queryset.filter(is_online=is_online)
return queryset return queryset

Loading…
Cancel
Save