![](/img/trans.png)
[英]Python: Check if the sentence contains any word from List (with fuzzy match)
[英]How to Query model where name contains any word in python list?
目標實現:
我想要名稱屬性包含列表中任何單詞的所有對象。
我有:
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.
例如:
if name="this is word2":
則應返回具有此類名稱的 object,因為 word2 在列表中。
請幫忙!
您可以使用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])
您還可以使用顯式 for 循環來構造Q
object。
ob_list = data.objects.filter(name__in=my_list)
順便說一句,避免使用變量名“list”(或任何其他 python 標准關鍵字),以免以后遇到一些奇怪的錯誤。
更新:(我猜你的問題也更新了,因為當我寫答案時,我沒有看到你寫的部分需要包含匹配而不是完全匹配)
您也可以使用正則表達式搜索來做到這一點,避免使用許多 Q 表達式(最終使用 SQL 中的許多 where “and” 子句,可能會降低性能),如下所示:
data.objects.filter(name__regex=r'(word1|word2|word3)')
obj_list = [obj for obj in data.objects.all() if any(name in obj.name for name in list)]
編輯:只需重新閱讀您的問題。 不知道您是否可以使用filter
來做到這一點,但您可以使用列表理解或生成器表達式來做到這一點。
對於比較 Arrays 的任何人,您可以使用 Django 的重疊過濾器來實現這一點。
從文檔:
返回數據與傳遞的值共享任何結果的對象。 使用 SQL 運算符 &&。
因此,您只需編寫:
ob_list = data.objects.filter(name__overlap=my_list)
非常簡單,只需使用“__in”,如下所示:
my_list= ['word1','word2','word3']
ob_list = model.objects.filter(your-field__in=my_list)
1-通過您的 model 名稱更改“型號”。
2-通過您的字段名稱更改“您的字段”。
我希望這會有所幫助。
只是想我會在這里添加這個。 在“使用 Q 對象”答案的基礎上進行了一些調整,以使搜索適用於跨指定字段的多個部分單詞匹配。
from functools import reduce
from django.contrib.postgres.search import SearchVector
from django.db.models import Q
s = "Input text to match to fields in SearchVector"
words = list(i for i in s.split(" "))
search_data = (
Item.objects.annotate(
search=SearchVector(
"id",
"name",
),
)
.filter(
reduce(
lambda x, y: x & y,
[Q(search__contains=word) for word in words],
)
)
.all()
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.