django - 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 是空的!
有人可以解释一下两个查询之间的区别吗?提前致谢。
解决方案
这是因为您正在过滤多值关系。正如文档解释的那样:
Django 有一致的处理
filter()
调用的方式。同时应用单个filter()
调用中的所有内容,以过滤掉符合所有这些要求的项目。连续filter()
调用进一步限制了对象集,但对于多值关系,它们适用于链接到主模型的任何对象,不一定是先前filter()
调用选择的那些对象。
因此,您的第一个案例选择了所有具有与日期要求匹配的 EAV 和与价格要求匹配的 EAV 的资产,但不一定是相同的 EAV。您的第二种情况仅选择那些有一个 EAV同时满足这两个要求的资产。
推荐阅读
- powershell - 用powershell执行命令
- c# - 单元格索引到字符串
- sql-server - 聚集索引默认排序顺序
- https - 我能否确定是否是我的 SSL 证书阻止了 JSON API 响应
- javascript - 当表单提交按钮在父组件中时,如何将子组件中的数据获取到父组件中?
- javascript - 如何使用 M/D/YYYY 格式编写带有日期条件的查找查询并存储为字符串
- onem2m - M2MServiceSubscriptionProfile Development in oneM2M
- php - CakePHP:如何增加超时会话?
- php - 如何在输出前处理帖子并将其导出为 CSV?
- wordpress - 如何为 WooCommerce 中的每个订单项目添加新的元项目?