如何查询模型中名称包含Python列表中任意单词?

39 投票
6 回答
28936 浏览
提问于 2025-04-16 23:45

目标:

我想找到所有名字属性中包含列表里任何一个单词的对象。

我有:

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 对象。

撰写回答