首页 > 解决方案 > Django ORM Queryset 类的行为与相同的过滤器不同

问题描述

这是一个简单的问题。

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


有人可以解释一下两个查询之间的区别吗?提前致谢。

标签: djangodjango-modelsdjango-querysetdjango-orm

解决方案


这是因为您正在过滤多值关系。正如文档解释的那样:

Django 有一致的处理filter()调用的方式。同时应用单个filter()调用中的所有内容,以过滤掉符合所有这些要求的项目。连续filter()调用进一步限制了对象集,但对于多值关系,它们适用于链接到主模型的任何对象,不一定是先前filter()调用选择的那些对象。

因此,您的第一个案例选择了所有具有与日期要求匹配的 EAV 和与价格要求匹配的 EAV 的资产,但不一定是相同的 EAV。您的第二种情况仅选择那些有一个 EAV同时满足这两个要求的资产。


推荐阅读