У меня есть страница, я пытаюсь получить страницу индекса со страницы объекта (сортировка по страницам в обратном порядке)
get_paginated_posts возвращает paginator для модели Post
:
class PostManager(models.Manager):
def get_paginated_posts(self, request=None):
if request and request.user.has_perm('blog.change_post'):
posts = super(PostManager, self).filter(is_update=False)
else:
posts = super(PostManager, self).filter(publish=True, is_update=False)
return Paginator(posts, POSTS_PER_PAGE)
.
.
Это моя модель
class Post(models.Model):
.
.
.
def get_page(self, request=None):
paginator = Post.objects.get_paginated_posts(request)
for i in range(1, paginator.num_pages+1):
if self in paginator.page(i).object_list:
return i
pass
return False
Меня беспокоит вызов Post.objects.get_paginated_posts
в функции get_page.
Правильно ли вызывать Post
класс из экземпляра? Есть ли другой лучший способ сделать это возможно?
Почему я не могу позвонить super(Post, self).objects.get_paginated_posts
, чтобы сделать то же самое?
Я понимаю, что self.objects.get_paginated_posts
не будет работать из-за отсутствия доступа объекта к его менеджеру.
решаемые
Финальный код, предложенный Томашом Элендтом:
class PostManager(models.Manager):
def get_paginated_posts(self, user=None):
if user and user.has_perm('blog.change_post'):
posts = super(PostManager, self).filter(is_update=False)
else:
posts = super(PostManager, self).filter(publish=True, is_update=False)
return Paginator(posts, POSTS_PER_PAGE)
class Post(models.Model):
.
def get_page(self, request=None):
return self._default_manager.filter(is_update = False, time__gt=self.time).count()/POSTS_PER_PAGE +1
#Just a one line now :P