Python 如何在Django中使用Q对象
我试图了解如何在Django中为网站制作一个简单的搜索表单。经过一些谷歌搜索,我自己做了几次失败后,我在views.py中得到了以下代码,其中'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
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传递给filterreduce(操作符和(a,b,c,…)
与a、b和c相同,并且…
所以这里有和:,以获得单个不可编辑的值?如果是,那么reduce()的目的是什么?谢谢。这里使用Q是因为输入中可能有多个术语,所以需要使用OR?是吗?没错。Q可与逻辑运算符(and、or、not)一起使用