如何查询模型中名称包含Python列表中任意单词?
目标:
我想找到所有名字属性中包含列表里任何一个单词的对象。
我有:
list = ['word1','word2','word3']
ob_list = data.objects.filter( // What to write here ? )
// or any other way to get the objects where any word in list is contained, in
// the na-me attribute of data.
举个例子:
如果名字是"this is word2":
那么这个名字的对象应该被返回,因为word2在列表里。
请帮帮我!
6 个回答
2
obj_list = [obj for obj in data.objects.all() if any(name in obj.name for name in list)]
编辑:刚刚重新看了一下你的问题。不确定你是否能用 filter
来做到这一点,但你可以使用列表推导式或者生成器表达式来实现。
33
ob_list = data.objects.filter(name__in=my_list)
顺便说一下,尽量不要用“list”这个变量名(或者其他任何Python的标准关键字),否则可能会遇到一些奇怪的错误。
更新:(我想你的问题也更新了,因为我写这个回答的时候没看到你提到你需要的是包含匹配,而不是精确匹配的部分)
你可以使用正则表达式搜索来实现这个功能,这样可以避免使用很多Q表达式(这些表达式最终会在SQL中产生很多“和”条件,可能会影响性能),具体方法如下:
data.objects.filter(name__regex=r'(word1|word2|word3)')
61
你可以使用 Q
对象 来构建这样的查询:
from django.db.models import Q
ob_list = data.objects.filter(reduce(lambda x, y: x | y, [Q(name__contains=word) for word in list]))
补充说明:
reduce(lambda x, y: x | y, [Q(name__contains=word) for word in list]))
这是一种比较高级的写法
Q(name__contains=list[0]) | Q(name__contains=list[1]) | ... | Q(name__contains=list[-1])
你也可以用一个明确的循环来构建 Q
对象。