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的不足。啊,这太棒了。非常感谢你们两位它现在工作得很好。