5

我有一个分页我正在尝试从对象页面获取索引页面(反向分页)

get_paginated_posts 返回模型的分页器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_postsget_page 函数中的调用。从实例
调用类是否正确?Post有没有其他更好的方法可以做到这一点?
为什么我不能打电话super(Post, self).objects.get_paginated_posts来做同样的事情?
我知道这self.objects.get_paginated_posts不会起作用,因为对象无法访问其管理器。

解决了

Tomasz Elendt 建议的最终代码:

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 
4

1 回答 1

4

你在做什么不是最好的主意。试着想象一下它将被翻译成多少个查询——在最坏的情况下,您需要从数据库中检索所有用户的帖子!

我假设您的Post模型(Paginator使用的模型)中有一些预定义的排序。使用它来获取该特定帖子记录之前的用户帖子数。如果您将该数字除以该POSTS_PER_PAGE值,您将获得您的页码。

恕我直言,PostManagerPost方法中使用是可以的。不好的是您将请求对象传递给它,而我认为您应该使用user_id它(权限检查应该是视图逻辑的一部分)。

编辑:示例

from django.db import models
from django.contrib.auth.models import User

POSTS_PER_PAGE = 10

class Post(models.Model):
    """
    >>> from datetime import datetime, timedelta
    >>> from django.db import connection
    >>> from django.conf import settings
    >>>
    >>> user = User.objects.create_user("test", "test@domain.com")
    >>> for i in xrange(100):
    ...     p = Post.objects.create(author=user,
    ...                             pub_date=datetime.now() - timedelta(hours=i))
    >>> post = Post.objects.all()[68]
    >>> settings.DEBUG = True    # monkey-patching settings - ugly
    >>> connection.queries = []  # cleaning previous queries
    >>> post.get_page()
    7
    >>> len(connection.queries)  # print number of queries of `get_page` call
    1
    """
    pub_date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(User)
    class Meta:
        ordering = ["-pub_date"]

    def get_page(self):
        return self._default_manager.filter(author__id=self.author_id).filter(
            pub_date__gt=self.pub_date).count() / POSTS_PER_PAGE + 1
于 2010-12-13T16:00:59.740 回答