Advertisement
Guest User

Untitled

a guest
Apr 3rd, 2020
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.22 KB | None | 0 0
  1.  
  2. class KeysPaginator(TimeLimitedPaginator):
  3.     @cached_property
  4.     def count(self):
  5.         if isinstance(self.object_list, QuerySet):
  6.             return self.object_list.aggregate(Max('id'))['id__max']
  7.         return super().count
  8.    
  9.     def page(self, number):
  10.         number = self.validate_number(number)
  11.         if isinstance(self.object_list, QuerySet):
  12.             return self._get_page(
  13.                 self.object_list
  14.                     .filter(id__lte=self.count - (number - 1) * self.per_page)
  15.                     .order_by('-id')
  16.                     .select_related(*get_related_names(self.object_list.model))[:self.per_page]
  17.                 , number, self)
  18.         else:
  19.             return super().page(number)
  20.  
  21.  
  22. def get_related_names(model, checked=frozenset()):
  23.     """Absolutely black magic function for recursively get all related fields"""
  24.     res = []
  25.     for name in dir(model):
  26.         if name in checked:
  27.             continue
  28.         inst = getattr(model, name)
  29.         if isinstance(inst, _FKClass):
  30.             res += [name + '__' + x for x in
  31.                 get_related_names(inst.field.related_model, checked=checked | frozenset([name]))]
  32.             res.append(name)
  33.     return res
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement