Django ORM Queryset类在使用相同过滤器时的行为有所不同

时间:2018-09-26 08:48:07

标签: django django-models django-queryset django-orm

这是一个简单的问题。

我想使用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为空!


可能有人解释两个查询之间的区别吗?预先感谢。

2 个答案:

答案 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')