构造Django过滤器使用args和kwargs动态查询 [英] Constructing Django filter queries dynamically with args and kwargs

查看:831
本文介绍了构造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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆