这是一个简单的问题。
我想使用Queryset类一次过滤2个过滤器。让我解释。
from django.db.models import Q
import datetime
from .models import Asset
query_set = Asset.objects.filter(category__name="car")
date_query = {'eav__date__gte': datetime.datetime(2018, 9, 2, 0, 0), 'eav__date__lte': datetime.datetime(2018, 9, 14, 0, 0)}
number_query = {'eav__price__gte': '60', 'eav__price__lte': '600'}
total_query = {'eav__date__gte': datetime.datetime(2018, 9, 2, 0, 0), 'eav__date__lte': datetime.datetime(2018, 9, 14, 0, 0),'eav__price__gte': '60', 'eav__price__lte': '600'}
query_set = query_set.filter(Q(**number_query))
query_set = query_set.filter(Q(**date_query))
在这种情况下,query_set为不为空!
query_set = query_set.filter(Q(**total_query))
在这种情况下,query_set为空!
可能有人解释两个查询之间的区别吗?预先感谢。
答案 0 :(得分:1)
这是因为您正在筛选多值关系。正如the docs所解释的:
Django具有处理
filter()
调用的一致方式。一次filter()
调用中的所有内容将同时应用,以过滤出符合所有这些要求的项目。连续filter()
调用进一步限制了对象的集合,但是对于多值关系,它们适用于链接到主模型的任何对象,不一定适用于先前的filter()
调用选择的那些对象。< / p>
因此,您的第一种情况会选择所有具有与日期要求相匹配的EAV和与价格要求相匹配的EAV的所有资产,但不一定是相同的EAV 。您的第二种情况仅选择同时具有两个两者要求的EAV的那些资产。
答案 1 :(得分:0)
使用Q对象构建查询集。 在Django中使用查询的最简单方法 就您而言
query_set = query_set.filter(Q(**number_query))
query_set = query_set.filter(Q(**date_query))
这些是不同的查询集。
query_set = query_set.filter(Q(**total_query))
在这里,您要合并两个不具有AND或OR条件的查询,因此该查询为空。 我想在这里要AND条件,所以请像这样使用 Q(first_name__startswith ='R')&Q(last_name__startswith ='D')