使用变量赋值的 Django ANDing 查询集过滤器
Django ANDing queryset filters using variable assignment
假设我有一个包含大量预取对象的产品查询集。
预取对象中有 "categories",类别可以有 "filters"。
并非每个产品都定义了类别和过滤器。
示例类别可以是 "price" 和 "color",过滤器可以是 "lt " 和 "blue"。
我只能使用 exclude 轻松获得具有 "price" 和 "color" 定义的产品。
但是我如何得到这个,例如:
All the Products that have "price"=* defined, and all the Products that have "color"="blue" defined.
有什么想法吗?
编辑:我将继续展示我想出的解决方案。请记住,上面的示例非常简单。有几十个类别,每个类别都有几十个过滤器。
假设用户选择了类别 'shoes' 但没有选择过滤器 'shoes': 'women' 或 'shoes': 'football'.
她选择了类别 'price' 和过滤器 'price':'lt '
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 '
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'))
假设我有一个包含大量预取对象的产品查询集。 预取对象中有 "categories",类别可以有 "filters"。 并非每个产品都定义了类别和过滤器。
示例类别可以是 "price" 和 "color",过滤器可以是 "lt " 和 "blue"。
我只能使用 exclude 轻松获得具有 "price" 和 "color" 定义的产品。
但是我如何得到这个,例如:
All the Products that have "price"=* defined, and all the Products that have "color"="blue" defined.
有什么想法吗?
编辑:我将继续展示我想出的解决方案。请记住,上面的示例非常简单。有几十个类别,每个类别都有几十个过滤器。
假设用户选择了类别 'shoes' 但没有选择过滤器 'shoes': 'women' 或 'shoes': 'football'.
她选择了类别 'price' 和过滤器 'price':'lt '
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 '
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'))