我想了解如何为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_icontains=q))
返回和错误(即使输入是一个单词)。我也不明白为什么减少需要获得按位值?
答案 0 :(得分:0)
为什么一个简单的result.filter(Q(somedbfield_icontains = q))返回错误
最简单的变体是result.filter(somedbfield__icontains=q)
那里不需要Q,Q用于扩展逻辑运算符(和,或者不是)的过滤。另外,请注意icontains
之前的双下划线。
为什么减少需要获得按位值?
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