@@ -16,7 +16,7 @@ def __init__(self):
1616 def paginate_queryset (self , queryset , request , view = None ):
1717
1818 if isinstance (queryset , QuerySet ):
19- self .count = queryset . count ( )
19+ self .count = self . get_queryset_count ( queryset )
2020 else :
2121 # We're dealing with an iterable, not a QuerySet
2222 self .count = len (queryset )
@@ -52,6 +52,9 @@ def get_limit(self, request):
5252
5353 return self .default_limit
5454
55+ def get_queryset_count (self , queryset ):
56+ return queryset .count ()
57+
5558 def get_next_link (self ):
5659
5760 # Pagination has been disabled
@@ -67,3 +70,16 @@ def get_previous_link(self):
6770 return None
6871
6972 return super ().get_previous_link ()
73+
74+
75+ class StripCountAnnotationsPaginator (OptionalLimitOffsetPagination ):
76+ """
77+ Strips the annotations on the queryset before getting the count
78+ to optimize pagination of complex queries.
79+ """
80+ def get_queryset_count (self , queryset ):
81+ # Clone the queryset to avoid messing up the actual query
82+ cloned_queryset = queryset .all ()
83+ cloned_queryset .query .annotations .clear ()
84+
85+ return cloned_queryset .count ()
0 commit comments