django - django orm 按相关日期字段过滤和排除
问题描述
模型.py
class Model(models.Model):
...
class RelatedModel(models.Model):
model = models.ForeignKey(Model, related_name="related_model")
date = models.DateField()
我想DateField
按月和年过滤对象。
- 首先我做了
Model.objects.all()
,我看到了 3 个实例 - 第二个我像这样过滤:
Model.objects.filter(related_model__date__month=6, related_model__date__year=2021)
结果只是 3 个实例中的 1 个 - 第三个也是最后一个,我像这样过滤
Model.objects.exclude(related_model__date__month=6, related_model__date__year=2021)
,结果是空的,我确信结果将与第二个查询相反,比如 3 个实例中的 2 个。
有什么解释吗?
谢谢。
文档中的答案:
诺塔
如上所述,对于跨越多值关系的查询,filter() 的行为并不等同于 exclude()。相反,单个 exclude() 调用中的条件不一定引用同一个项目。
例如,以下查询将排除同时包含标题中带有 «Lennon» 的条目和 2008 年发布的条目的博客:
Blog.objects.exclude(entry__headline__contains='Lennon', entry__pub_date__year=2008, )
但是,与使用 filter() 时的行为不同,这不会根据满足这两个条件的条目来限制博客。为了做到这一点,即选择所有不包含在 2008 年发布的以 «Lennon» 发布的条目的博客,您需要进行两个查询:
Blog.objects.exclude(entry__in=Entry.objects.filter(headline__contains='Lennon', pub_date__year=2008, ), )
解决方案
有多个RelatedModel
相同的实例,Model
其中一个可以有month=6
,另一个可以有year=2021
。排除也会消除这些
如记录的那样,您将必须准确过滤具有这两种条件的实例
Model.objects.exclude(
related_model__in=RelatedModel.objects.filter(
related_model__date__month=6,
related_model__date__year=2021,
),
)
推荐阅读
- r - R中的假设检验
- reactjs - reactjs中带有一些数据的api请求
- javascript - 反应受保护的路线
- android - 如何正确请求使用附近服务的权限?
- php - Laravel 在 DB where('week', $week) 和 where('user_id', $user_id) 中查找 id
- pyqt5 - QTableView中可调整大小的列标题在pyqt5中不起作用
- bots - Discord.py - 无法尝试/除了 403:用户不接受 DM
- python - 使用 python-dataframes 将 200 万行插入到 timscaldb
- c# - Unity 停止响应基于网格的顶点数
- azure-devops - 创建矩阵小部件