Python 如何在Django中使用Q对象

Python 如何在Django中使用Q对象,python,django,search,Python,Django,Search,我试图了解如何在Django中为网站制作一个简单的搜索表单。经过一些谷歌搜索,我自己做了几次失败后,我在views.py中得到了以下代码,其中'q'是从表单中检索到的值: class BookSearchListView(BookListView): def get_queryset(self): result=super(BookSearchListView, self).get_queryset() query=self.request.GET.get

我试图了解如何在Django中为网站制作一个简单的搜索表单。经过一些谷歌搜索,我自己做了几次失败后,我在views.py中得到了以下代码,其中'q'是从表单中检索到的值:

class BookSearchListView(BookListView):
    def get_queryset(self):
        result=super(BookSearchListView, self).get_queryset()
        query=self.request.GET.get('q')
        if query:
            query_list=query.split()
            result=result.filter(reduce(operator.and_,(Q(title__icontains=q) for q in query_list))) 
        return result
我已经理解了它是如何工作的,以及为什么会有reduce和operator.and.(我的意思是,我想我理解)。但我不明白为什么一个简单的
result=result.filter(Q(somedbfield\u icontains=Q))
返回并出错(即使输入是一个单词)。我也不明白为什么reduce需要获得位值

为什么一个简单的result.filter(Q(somedbfield\u icontains=Q))返回并出错

最简单的变体是
result.filter(somedbfield\uuu icontains=q)
q在这里不需要,q用于使用逻辑运算符(and、or、not)扩展过滤。另外,请注意
icontains
前面的双下划线

为什么reduce需要获得位值

reduce
用于将任何函数应用于一组参数:

operator.add(1,2)
1+2

reduce(operator.add,(1,2,3,4,5))
(((1+2)+3)+4)+5)相同

大致如下:

def reduce(function, iterable):
    it = iter(iterable)
    value = next(it)

    for element in it:
        value = function(value, element)

    return value

你能添加你得到的确切错误消息吗?当我将其缩减为result=result.filter(查询列表中Q的Q(title\u icontains=Q)时,我得到的异常是:“没有足够的值来解包(预期为2,得到1)”,你不能将一个iterable传递给filter
reduce(操作符和(a,b,c,…)
a、b和c相同,并且…
所以这里有和:,以获得单个不可编辑的值?如果是,那么reduce()的目的是什么?谢谢。这里使用Q是因为输入中可能有多个术语,所以需要使用OR?是吗?没错。Q可与逻辑运算符(and、or、not)一起使用