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]
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(
operation_description=doc_course_list(),
manual_parameters=[
@ -59,7 +50,7 @@ class CourseListAPIView(ListAPIView):
openapi.Parameter(
'status', openapi.IN_QUERY,
type=openapi.TYPE_STRING,
description="""Status =>
description="""Status =>
Upcoming (visible but registration not allowed)---Предстоящие
Registering (registration is open)---регистрация
Ongoing (course has started, registration closed)---Впроцессе
@ -79,13 +70,20 @@ class CourseListAPIView(ListAPIView):
),
])
def get(self, request, *args, **kwargs):
return super().get(request, *args, **kwargs)
return super().get(request, *args, **kwargs)
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
filters = request.query_params
# Handle category_slug with multiple values separated by commas
if category_slugs := filters.get('category_slug'):
category_slugs_list = category_slugs.split(',')
@ -95,7 +93,7 @@ class CourseListAPIView(ListAPIView):
if statuses := filters.get('status'):
statuses_list = statuses.split(',')
queryset = queryset.filter(status__in=statuses_list)
if is_free := filters.get('is_free'):
is_free = is_free.lower() == 'true'
queryset = queryset.filter(
@ -104,7 +102,7 @@ class CourseListAPIView(ListAPIView):
if is_online := filters.get('is_online'):
is_online = is_online.lower() == 'true'
queryset = queryset.filter(is_online=is_online)
return queryset

Loading…
Cancel
Save