【发布时间】:2011-07-06 09:30:26
【问题描述】:
有没有办法使用 django 的内置分页对 rawqueryset 进行分页? 当我将它转换为列表时,它会在我的脸上抛出一个错误 ...TypeError: expected string or Unicode object, NoneType found。有没有办法解决这个问题?
【问题讨论】:
标签: python django django-pagination
有没有办法使用 django 的内置分页对 rawqueryset 进行分页? 当我将它转换为列表时,它会在我的脸上抛出一个错误 ...TypeError: expected string or Unicode object, NoneType found。有没有办法解决这个问题?
【问题讨论】:
标签: python django django-pagination
我设法使用以下方法实现了它:
paginator = Paginator(files, 12)
paginator._count = len(list(files))
django.core.paginator.py 中的代码:
raw_queryset 上的 len 不起作用,但将实际的分页器对象转换为列表可以在 Django 1.3 中为我找到
【讨论】:
paginator.get_page(),它就会完全加载到内存中。为避免这种情况,我认为您必须继承 RawQuerySet,并确保您的原始 SQL 具有 LIMIT/OFFSET - 即使这样,您也会丢失普通查询集的结果缓存,因此访问 qs[0] 两次将命中数据库两次。
您可以为 RawQuerySet 对象手动设置属性计数:
items = Item.objects.raw("select * from appitem_item")
def items_count():
cursor = connection.cursor()
cursor.execute("select count(*) from appitem_item")
row = cursor.fetchone()
return row[0]
items.count = items_count
对于@Rockallite
>>> class A():
... def b(self):
... print 'from b'
...
>>>
>>> (A()).b()
from b
>>> def c():
... print 'from c'
...
>>> a = A()
>>> a.b = c
>>> a.b()
from c
【讨论】:
count() 方法。所以设置count属性是行不通的。
qs.filter(**pfilter).distinct().extra(select={'test': 'COALESCE(`psearch_program`.`eu_price`, 999999999)'}).extra(order_by=['test'])
【讨论】: