Django分页和原始查询集

13 投票
3 回答
6433 浏览
提问于 2025-04-16 12:44

有没有办法用Django自带的分页功能来处理一个原始查询集(raw queryset)?我把它转换成列表的时候,结果报了个错……TypeError: 期望是字符串或Unicode对象,但找到了NoneType。这有什么解决办法吗?

3 个回答

-1

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,当你按下一个按钮,程序就会做出反应。这种情况通常会用到“事件监听器”。

事件监听器就像是一个守卫,它一直在关注你程序中的某些事情,比如用户的点击、键盘输入等。当这些事情发生时,守卫就会立刻通知程序去执行相应的操作。

举个例子,如果你在网页上有一个“提交”按钮,事件监听器会监控这个按钮。当用户点击这个按钮时,事件监听器会捕捉到这个点击事件,然后触发程序去处理提交的内容。

总之,事件监听器帮助程序及时响应用户的操作,让程序变得更加互动和友好。

qs.filter(**pfilter).distinct().extra(select={'test': 'COALESCE(`psearch_program`.`eu_price`, 999999999)'}).extra(order_by=['test'])
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

给 @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
16

我用以下方法成功实现了这个功能:

paginator = Paginator(files, 12)
paginator._count = len(list(files))

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

  • 检查是否设置了_count
  • 如果没有,就尝试运行.count(),但这个方法并不存在
  • 如果还是没有,就尝试用普通的len

在原始查询集上用len是行不通的,但把实际的分页器对象转换成列表在Django 1.3中对我来说是有效的。

撰写回答