构造Django过滤器使用args和kwargs动态查询 [英] Constructing Django filter queries dynamically with args and kwargs
本文介绍了构造Django过滤器使用args和kwargs动态查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在动态构建一些Django过滤器查询,使用此示例:
I'm constructing some Django filter queries dynamically, using this example:
kwargs = { 'deleted_datetime__isnull': True }
args = ( Q( title__icontains = 'Foo' ) | Q( title__icontains = 'Bar' ) )
entries = Entry.objects.filter( *args, **kwargs )
我不知道如何构建 args
的条目。说我有这个数组:
I'm just not sure how to construct the entry for args
. Say I have this array:
strings = ['Foo', 'Bar']
如何从那里获取:
args = ( Q( title__icontains = 'Foo' ) | Q( title__icontains = 'Bar' )
我最接近的是:
for s in strings:
q_construct = Q( title__icontains = %s) % s
args.append(s)
但我不知道如何设置
But I don't know how to set up the |
condition.
推荐答案
您可以直接使用kwarg格式(我不知道适当的术语)
You can iterate it directly using a kwarg format (I don't know the proper term)
argument_list = [] #keep this blank, just decalring it for later
fields = ('title') #any fields in your model you'd like to search against
query_string = 'Foo Bar' #search terms, you'll probably populate this from some source
for query in query_string.split(' '): #breaks query_string into 'Foo' and 'Bar'
for field in fields:
argument_list.append( Q(**{field+'__icontains':query_object} ) )
query = Entry.objects.filter( reduce(operator.or_, argument_list) )
# --UPDATE-- here's an args example for completeness
order = ['publish_date','title'] #create a list, possibly from GET or POST data
ordered_query = query.order_by(*orders()) # Yay, you're ordered now!
这将查找您的 query_string中的每个字符串
在字段中的每个字段中
和OR结果
This will look for each string in your query_string
in each field in fields
and OR the result
我希望我仍然拥有我的原始来源,但是这是从我使用的代码改编。
I wish I still had my original source for this, but this is adapted from code I use.
这篇关于构造Django过滤器使用args和kwargs动态查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文