假设我有一个product的查询集,其中包含大量预取对象。预取对象中有"类别",类别可以有"过滤器"。不是每个产品都定义了类别和过滤器。
示例分类可以是"price"one_answers"color",过滤器可以是"lt $5"one_answers"blue"。
我可以很容易地得到只有"价格"one_answers"颜色"定义的产品,使用exclude。
但是我怎么得到这个呢,例如:
定义了"price"=*的所有产品,以及定义了"color"="blue"的所有产品。
任何想法?
编辑:我将继续展示我想出的解决方案。记住,上面的例子是非常简化的。有几十个类别,每个类别都有几十个过滤器。
假设用户选择了"鞋子"类别,但没有过滤"鞋子":"女性"或"鞋子":"足球"。
她选择了类别'price'和过滤器'price': '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()
我希望这足够清楚,并且它可以帮助其他人通过类似的事情。
如果不知道模型的样子,我将使用以下查询:
查询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'))