使用变量赋值的{Django ANDing查询集过滤器

时间:2015-06-10 14:46:43

标签: django django-queryset

假设我有一个产品查询集,其中包含大量预取对象。 预取对象中有“类别”,类别可以有“过滤器”。 并非每个产品都定义了类别和过滤器。

示例类别可以是“价格”和“颜色”,过滤器可以是“lt $ 5”和“blue”。

我只能使用exclude来轻松定义具有“价格”和“颜色”的产品。

但我如何得到这个,例如:

  

定义了“price”= *的所有产品,以及定义了“color”=“blue”的所有产品。

有什么想法吗?

编辑:我会继续展示我想出的解决方案。请记住,上面的例子非常简单。有几十个类别,每个类别都有几十个过滤器。

想象一下,用户选择了“鞋子”类别,但没有过滤鞋子:“女性”或“鞋子”:“足球”。

她选择了“价格”类别并过滤“价格”:'lt $ 5'

from django.db.models import Q
import operator
argument_list = []
# categories_selected = all the categories that have been checked on the page     
for c in categories_selected: 
# categories_filtered = all the (selected) categories that have filters applied
    if c not in categories_filtered:
        # Here we get all where <category>_id is defined
        argument_list.append(Q(**{c+'__id__isnull': False}))
    else:
        for f in get_category_filters_from_url(filters_selected, c):
        # get_category_filters_from_url() returns all the filters (by id) belonging 
        # to a given category, e.g., 'price': 'lt $5'
            argument_list.append(Q(**{c+'__id': f}))

resources = resources.filter(reduce(operator.or_, argument_list)).distinct()

我希望这很清楚,并且它可以帮助别人混淆这样的事情。

1 个答案:

答案 0 :(得分:2)

在不知道模型的样子的情况下,我会使用以下查询:

使用AND查询:

Product.objects.filter(categories__price__isnull=False, categories__color='blue')

使用OR查询:

from django.db.models import Q

Product.objects.filter(Q(categories__price__isnull=False) | Q(categories__color='blue'))