Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何从request.GET参数创建筛选器?_Django - Fatal编程技术网

Django 如何从request.GET参数创建筛选器?

Django 如何从request.GET参数创建筛选器?,django,Django,可能重复: 我正在使用我的应用程序中的过滤功能。我通过jquery向jquery中的Django发送一个逗号分隔的字符串,我将空格替换为+,这样就可以通过线路发送 /?ajax&sales_item=t2,+t1 现在在我检索GET参数的视图中,我可以看到Django已经用空格替换了+了,这很好。然后我用逗号分割关键字,去掉空格 sales_item_raw = request.GET['sales_item'] sales_item_keywords = sales_item_ra

可能重复:


我正在使用我的应用程序中的过滤功能。我通过jquery向jquery中的Django发送一个逗号分隔的字符串,我将空格替换为+,这样就可以通过线路发送

/?ajax&sales_item=t2,+t1
现在在我检索GET参数的视图中,我可以看到Django已经用空格替换了+了,这很好。然后我用逗号分割关键字,去掉空格

sales_item_raw = request.GET['sales_item']
sales_item_keywords = sales_item_raw.split(',')            
我需要首先检查给定的名称是否作为销售商品存在。我必须使用icontains,因此销售项目可以是多个项目

for item in sales_item_keywords:
        sales_items = profile.company.salesitem_set.filter(item_description__icontains=item.strip())            
最后但并非最不重要的一点是,queryset用于筛选给定销售项目的交易:

deals_queryset = deals_queryset.filter(sales_item__in=sales_items)
如果用户只筛选一个可以正常工作的关键字,但是如果有两个关键字,那么在每个循环迭代中,sales_项将明显被覆盖

解决这个问题最有效的方法是什么?我是否应该将每个迭代中sales_Items的内容附加到循环外的列表中?并最终将新列表发送到final deals_queryset.filter

我不确定这是否是解决此问题的好方法…

使用Django的对象在过滤器中创建或逻辑

# create a chain of Qs, one for each item, and "or" them together 
q_filters = Q(item_description__icontains=sales_item_keywords[0].strip())
for item in sales_item_keywords[1:]:
    q_filters = q_filters | Q(item_description__icontains=item.strip())   

# do a single filter with the chained Qs
profile.company.salesitem_set.filter(q_filters)
这是一段难看的代码,因为我不确定如何优雅地处理初始Q,也不确定什么是可以链接所有其他Q的空Q,包括第一个Q。我猜你可以使用Qpk=pk,但这在另一个方面很难看

编辑:上面Ignacio的链接显示了方法,即

q_filters = reduce(operator.or_, (Q(item_description__icontains=item.strip()) for item in sales_items_keywords))
profile.company.salesitem_set.filter(q_filters)
使用Django的对象在过滤器中创建or逻辑

# create a chain of Qs, one for each item, and "or" them together 
q_filters = Q(item_description__icontains=sales_item_keywords[0].strip())
for item in sales_item_keywords[1:]:
    q_filters = q_filters | Q(item_description__icontains=item.strip())   

# do a single filter with the chained Qs
profile.company.salesitem_set.filter(q_filters)
这是一段难看的代码,因为我不确定如何优雅地处理初始Q,也不确定什么是可以链接所有其他Q的空Q,包括第一个Q。我猜你可以使用Qpk=pk,但这在另一个方面很难看

编辑:上面Ignacio的链接显示了方法,即

q_filters = reduce(operator.or_, (Q(item_description__icontains=item.strip()) for item in sales_items_keywords))
profile.company.salesitem_set.filter(q_filters)

我通过jquery向jquery中的Django发送一个逗号分隔的字符串,我将空格替换为+,这样就可以通过线路发送。没有必要;Django处理多个GET参数没有问题。感谢您指出这一点。它不是关于多个GET参数,如果我没有用+替换空格,我只会得到传入的第一个参数。/?ajax&sales_item=t2,空格将删除第二个参数。至少我的serverrun上正在发生这种情况。/?ajax&sales\u item=t2&sales\u item=t1ahh现在我知道我的错误在哪里了。再次感谢您的帮助如果有人想提出一些更通用的东西,那么值得将django的管理过滤器作为灵感来源,我通过jquery向jquery中的django发送一个逗号分隔的字符串,我将空格替换为+,这样就可以通过网络发送。没有必要;Django处理多个GET参数没有问题。感谢您指出这一点。它不是关于多个GET参数,如果我没有用+替换空格,我只会得到传入的第一个参数。/?ajax&sales_item=t2,空格将删除第二个参数。至少我的serverrun上正在发生这种情况。/?ajax&sales\u item=t2&sales\u item=t1ahh现在我知道我的错误在哪里了。再次感谢您的帮助如果有人想提出一些更通用的东西,那么值得一看django的管理过滤器,因为它是灵感的源泉,reduce足够聪明,可以。。。哦您没有使用reduce。@IgnacioVazquez Abrams-:-根据您的另一个答案,我在中添加了该方法,同时您注意到reduce的不足。啊,这太棒了。非常感谢你们两位它现在工作得很好。reduce足够聪明,可以。。。哦您没有使用reduce。@IgnacioVazquez Abrams-:-根据您的另一个答案,我在中添加了该方法,同时您注意到reduce的不足。啊,这太棒了。非常感谢你们两位它现在工作得很好。