簡體   English   中英

Django從模型中過濾:Model.objects.filter(Q())

[英]Django filtering from models: Model.objects.filter(Q())

我需要使用django ORM在數據庫中搜索一些數據,這應該是所有列都要搜索的。 問題是我在作為參數進入函數之前不知道要搜索什么。

這是源代碼:

search = request.GET.get('search_value')
#row_to_search is turple i get to function
#it could be different at every searching
#it looks like here:
rows_to_search = ('name', 'age', 'salary')

我需要在我的數據庫中搜索這些行,如下所示:

query = Mymodel.objects.filter(Q(name__iregex=search) |      \
                               Q(age__iregex=search)  |      \
                               Q(salary__iregex=search))

如果我要搜索更多行,如何制作代碼?

我試過這樣的東西,但它接縫它根本不起作用:

Q_filter = map(lambda q: 'Q('+q+')', map(lambda s: s+'__regex='+search, rows_to_search))
searchline = '|'.join(Q_filter)

我不能調用model.objects.filter(searchline) ,因為它是一個String。 可以在這里做點什么,還是架構錯了? 我應該制作自定義模型管理器嗎?

以下是明確執行此操作的一種方法:

>>> Q_filter = Q()
>>> for value in rows_to_search:
...     Q_filter |= Q(**{"{}__iregex".format(value): search})

這是使用reduce()的單線程:

>>> Q_filter = reduce(lambda x, y: x | Q(**{"{}__iregex".format(y): search}), rows_to_search, Q())

使用operator.or_另一個單行程序與列表推導:

>>> Q_filter = reduce(operator.or_, [Q(**{"{}__iregex".format(key): search}) for key in rows_to_search])

然后您可以按如下方式調用查詢:

MyModel.objects.filter(Q_filter)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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