[AAP-93974] perf(api): optimize non-superuser job list pagination (#16668)

perf(api): optimize non-superuser job list pagination

Co-authored-by: Jake Jackson <24478650+thedoubl3j@users.noreply.github.com>
This commit is contained in:
Elijah DeLee
2026-10-09 21:31:23 -04:00
committed by GitHub
co-authored by Jake Jackson
parent 33a9eb7d15
commit f8314ada72
6 changed files with 99 additions and 3 deletions
+13
View File
@@ -45,6 +45,15 @@ class UnifiedJobPaginator(DjangoPaginator):
return UnifiedJob.objects.count()
class JobPaginator(DjangoPaginator):
"""Count visible jobs through a primary-key subquery instead of full rows."""
@cached_property
def count(self):
visible_pks = self.object_list.order_by().values("pk")
return self.object_list.model.objects.filter(pk__in=visible_pks).count()
class Pagination(pagination.PageNumberPagination):
page_size_query_param = "page_size"
max_page_size = settings.MAX_PAGE_SIZE
@@ -135,6 +144,10 @@ class UnifiedJobPagination(Pagination):
return DjangoPaginator
class JobPagination(Pagination):
django_paginator_class = JobPaginator
class LimitPagination(pagination.BasePagination):
default_limit = api_settings.PAGE_SIZE
limit_query_param = "limit"
+2 -1
View File
@@ -130,7 +130,7 @@ from awx.api.views.mixin import (
NoTruncateMixin,
UnifiedJobExcludeMixin,
)
from awx.api.pagination import ActivityStreamPagination, UnifiedJobEventPagination, UnifiedJobPagination
from awx.api.pagination import ActivityStreamPagination, JobPagination, UnifiedJobEventPagination, UnifiedJobPagination
from awx.main.utils import set_environ
logger = logging.getLogger('awx.api.views')
@@ -3885,6 +3885,7 @@ class SystemJobTemplateNotificationTemplatesSuccessList(SystemJobTemplateNotific
class JobList(UnifiedJobExcludeMixin, ListAPIView):
model = models.Job
serializer_class = serializers.JobListSerializer
pagination_class = JobPagination
resource_purpose = 'jobs'
@extend_schema_if_available(extensions={"x-ai-description": "A list of jobs."})