django分页和RawQuerySet

mos*_*lix 11 python django django-pagination

有没有办法使用django的内置分页对rawqueryset进行分页?当我把它投射到列表时,它会在我的脸上抛出一个错误... TypeError:期望的字符串或Unicode对象,找到NoneType.有没有解决的办法?

Chr*_*ris 15

我设法使用以下方法实现它:

paginator = Paginator(files, 12)
paginator._count = len(list(files))
Run Code Online (Sandbox Code Playgroud)

django.core.paginator.py中的代码:

  • 检查_count是否已设置
  • 如果没有,那么尝试运行不存在的.count()
  • 如果没有,那么尝试普通len

在raw_queryset上的len不起作用但是将实际的paginator对象转换为列表可以在Django 1.3中找到我的工具

  • 很明显,对于大型原始查询集,len(list(files))的内存效率非常低.如果您知道运行的查询,则可以使用COUNT(*)运行另一个查询,并将其分配给paginator._count,只要每个查询之间的结果数不会发生变化.或者,如果查询结果不断变化,则不同的DBMS可以在查询的每一行中嵌入总行数. (7认同)

And*_*dov 5

您可以手动为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
Run Code Online (Sandbox Code Playgroud)

对于@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
Run Code Online (Sandbox Code Playgroud)