如何在Django中使用Q对象

时间:2017-05-17 07:01:54

标签: 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('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))返回和错误(即使输入是一个单词)。我也不明白为什么减少需要获得按位值?

1 个答案:

答案 0 :(得分:0)

  

为什么一个简单的result.filter(Q(somedbfield_icontains = q))返回错误

最简单的变体是result.filter(somedbfield__icontains=q)那里不需要Q,Q用于扩展逻辑运算符(和,或者不是)的过滤。另外,请注意icontains之前的双下划线。

  

为什么减少需要获得按位值?

It dosen't

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