|
|
@@ -16,7 +16,7 @@ class OptionalLimitOffsetPagination(LimitOffsetPagination):
|
|
|
def paginate_queryset(self, queryset, request, view=None):
|
|
|
|
|
|
if isinstance(queryset, QuerySet):
|
|
|
- self.count = queryset.count()
|
|
|
+ self.count = self.get_queryset_count(queryset)
|
|
|
else:
|
|
|
# We're dealing with an iterable, not a QuerySet
|
|
|
self.count = len(queryset)
|
|
|
@@ -52,6 +52,9 @@ class OptionalLimitOffsetPagination(LimitOffsetPagination):
|
|
|
|
|
|
return self.default_limit
|
|
|
|
|
|
+ def get_queryset_count(self, queryset):
|
|
|
+ return queryset.count()
|
|
|
+
|
|
|
def get_next_link(self):
|
|
|
|
|
|
# Pagination has been disabled
|
|
|
@@ -67,3 +70,16 @@ class OptionalLimitOffsetPagination(LimitOffsetPagination):
|
|
|
return None
|
|
|
|
|
|
return super().get_previous_link()
|
|
|
+
|
|
|
+
|
|
|
+class StripCountAnnotationsPaginator(OptionalLimitOffsetPagination):
|
|
|
+ """
|
|
|
+ Strips the annotations on the queryset before getting the count
|
|
|
+ to optimize pagination of complex queries.
|
|
|
+ """
|
|
|
+ def get_queryset_count(self, queryset):
|
|
|
+ # Clone the queryset to avoid messing up the actual query
|
|
|
+ cloned_queryset = queryset.all()
|
|
|
+ cloned_queryset.query.annotations.clear()
|
|
|
+
|
|
|
+ return cloned_queryset.count()
|