Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class KeysPaginator(TimeLimitedPaginator):
- @cached_property
- def count(self):
- if isinstance(self.object_list, QuerySet):
- return self.object_list.aggregate(Max('id'))['id__max']
- return super().count
- def page(self, number):
- number = self.validate_number(number)
- if isinstance(self.object_list, QuerySet):
- return self._get_page(
- self.object_list
- .filter(id__lte=self.count - (number - 1) * self.per_page)
- .order_by('-id')
- .select_related(*get_related_names(self.object_list.model))[:self.per_page]
- , number, self)
- else:
- return super().page(number)
- def get_related_names(model, checked=frozenset()):
- """Absolutely black magic function for recursively get all related fields"""
- res = []
- for name in dir(model):
- if name in checked:
- continue
- inst = getattr(model, name)
- if isinstance(inst, _FKClass):
- res += [name + '__' + x for x in
- get_related_names(inst.field.related_model, checked=checked | frozenset([name]))]
- res.append(name)
- return res
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement