如何从 request.GET 参数创建过滤器? [复制]
Posted
技术标签:
【中文标题】如何从 request.GET 参数创建过滤器? [复制]【英文标题】:How to create a filter from request.GET parameters? [duplicate] 【发布时间】:2012-08-26 06:23:49 【问题描述】:可能重复:filter using Q object with dynamic from user?
我正在开发我的应用程序中的过滤器功能。我通过 jquery 向 Django 发送一个逗号分隔的字符串(在 jquery 中,我将空格替换为 +,以便可以通过网络发送)。
/?ajax&sales_item=t2,+t1
现在在我检索 GET 参数的视图中,我可以看到 Django 已经将 + 替换为空格,这很棒。然后我用逗号分割关键字并去掉空格。
sales_item_raw = request.GET['sales_item']
sales_item_keywords = sales_item_raw.split(',')
我需要首先检查给定名称是否作为销售项目存在。我必须使用icontains
,因此sales_items
可以不止一项。
for item in sales_item_keywords:
sales_items = profile.company.salesitem_set.filter(item_description__icontains=item.strip())
最后但并非最不重要的一点是,查询集用于过滤给定 sales_items 的交易:
deals_queryset = deals_queryset.filter(sales_item__in=sales_items)
如果用户只过滤一个可以正常工作的关键字,但是如果有两个关键字,sales_items
显然会在每次循环迭代中被覆盖。
解决此问题的最有效方法是什么?我是否应该将每次迭代中sales_items
的内容附加到循环外的列表中?并最终将新列表发送到最终deals_queryset.filter
?
我不确定这是否是解决这个问题的好方法......
【问题讨论】:
“我通过 jquery 向 Django 发送一个逗号分隔的字符串(在 jquery 中,我将空格替换为 +,以便可以通过网络发送)。”没有必要; Django 处理多个 GET 参数没有问题with the same name. 感谢您指出。这与多个 GET 参数无关,如果我没有用 + 替换空格,我只会得到传入的第一个参数。/?ajax&sales_item=t2,
空格切断了第二个参数。至少这是我的 serverrun 上发生的事情。
/?ajax&sales_item=t2&sales_item=t1
啊现在我明白我的错误在哪里了。再次感谢你的帮助。 :)
如果有人想提出更通用的东西,值得看看 django 的管理过滤器作为灵感来源github.com/django/django/blob/master/django/contrib/admin/…
【参考方案1】:
使用 Django 的 Q 对象在过滤器中创建“或”逻辑。
# 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。 (我猜你可以使用 Q(pk=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)
【讨论】:
reduce()
足够聪明......哦。你没有使用reduce()
。
@IgnacioVazquez-Abrams -- :-) 根据您的其他答案,我正在添加该方法,同时您注意到缺少 reduce()
。
啊,这太棒了。非常感谢你们俩。 :) 现在效果很好。以上是关于如何从 request.GET 参数创建过滤器? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Django 从模型中过滤:Model.objects.filter(Q())