2

可能重复:
使用来自用户的动态 Q 对象进行过滤?

我正在开发我的应用程序中的过滤器功能。我通过 jquery 向 Django 发送一个逗号分隔的字符串(在 jquery 中,我将空格替换为 +,以便可以通过网络发送)。

/?ajax&sales_item=t2,+t1

现在在检索 GET 参数时的视图中,我可以看到 Django 已经将 + 替换为空格,这很棒。然后我用逗号分割关键字并去掉空格。

sales_item_raw = request.GET['sales_item']
sales_item_keywords = sales_item_raw.split(',')            

我需要首先检查给定的名称是否作为销售项目存在。我必须使用 a 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

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

4

1 回答 1

0

使用 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),但这以不同的方式很难看。)

编辑:上面的伊格纳西奥链接显示了方式,即

q_filters = reduce(operator.or_, (Q(item_description__icontains=item.strip()) for item in sales_items_keywords))
profile.company.salesitem_set.filter(q_filters)
于 2012-08-31T13:23:03.033 回答