簡體   English   中英

如何查詢 model 名稱包含 python 列表中的任何單詞?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM