Sql 在Django中,如何从列表中构建一组标准?

Sql 在Django中,如何从列表中构建一组标准?,sql,django,python-3.x,criteria,Sql,Django,Python 3.x,Criteria,我正在使用Python3.7和Django。有没有一种方法可以重写下面的内容,让我只执行一个查询而不是一堆查询 def get_articles_with_words_in_titles(self, long_words): result = {} for word in long_words: qset = Article.objects.filter(title__icontains=word.lower()) result.extend( q

我正在使用Python3.7和Django。有没有一种方法可以重写下面的内容,让我只执行一个查询而不是一堆查询

def get_articles_with_words_in_titles(self, long_words):
    result = {}
    for word in long_words:
        qset = Article.objects.filter(title__icontains=word.lower())
        result.extend( qset )
    return result

我想获得文章对象的唯一列表,其中至少包含一个单词。

您可以使用。它们非常有用,可以将查询链接在一起。与
functools
一起使用的
reduce
使您可以将一系列Q对象链接在一起
reduce
有两个参数,第一个是运算符,在我们的例子中,我们使用的是
与:
相同,第二个是序列<代码>减少
然后将运算符放在每个元素之间


这篇博文也非常有用

是的,您可以使用以下库对其进行迭代:

from functools import reduce   
from django.db.models import Q
import operator

qset = Article.objects.filter(reduce(operator.or_, (Q(title__icontains=x) for x in long_words)))

这一行“Article.objects.filter(reduce(operator.or_u(q_list))”给了我一个错误,“TypeError:或uu2参数,得到1”。我在“long_单词”出现时测试了它数组包含两个字符串。它应该是固定的。我没有办法测试代码。我应该放一个免责声明!我在尝试您的答案时出错,但当我将“icontain”更改为“icontains”时,一切都解决了。固定的!很好的捕获。
from functools import reduce   
from django.db.models import Q
import operator

qset = Article.objects.filter(reduce(operator.or_, (Q(title__icontains=x) for x in long_words)))