cro*_*jer 5 django django-models django-managers django-pagination
我有一个分页,我试图从对象页面获取索引页面(反向分页)
get_pagination_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)
.
.
Run Code Online (Sandbox Code Playgroud)
这是我的模型
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
Run Code Online (Sandbox Code Playgroud)
我关心的是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
Run Code Online (Sandbox Code Playgroud)
这不是你正在做的最好的主意。尝试想象它将被翻译成多少个查询——在最坏的情况下,您需要从数据库中检索所有用户的帖子!
我假设您的Post模型中有一些预定义的顺序(使用的顺序Paginator)。使用它来获取该特定帖子记录之前的用户帖子数。如果将该数字除以该POSTS_PER_PAGE值,您将得到页码。
PostManager恕我直言,在方法中使用Post是可以的。不好的是你将请求对象传递给它,而我认为你应该使用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2949 次 |
| 最近记录: |