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_posts、get_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値で割ると、ページ番号が得られます。

PostManagerメソッドで使用するIMHOPostは問題ありません。うまくいかないのは、リクエストオブジェクトを渡して、そのために使用する必要があると思うことです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 に答える