如何从 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())

Python——仅在变量存在时传递参数

PythonDjango filter 如何支持 or 条件过滤?

drf--视图,路由

使用 Q 过滤 django 数据

如何在Django中接收JSON格式的数据