Django如何用ORM单次查询筛选日期范围不匹配关联父模型的子模型
你当前写的循环逻辑是无效的,pd.date_range(start=child_model.start_date, end=child_model.end_date)生成的日期范围天然包含起止日期,所以你写的判断条件永远不会触发,拿不到你想要的结果。而且全量加载实例到内存循环的方式在数据量大的时候性能极差,完全可以用Django ORM 单次查询在数据库层完成过滤。
实现代码
首先导入需要的工具:
from django.db.models import Q, F
查询语句如下,直接返回所有符合要求的ChildModel实例:
exceeding_child_models = ChildModel.objects.filter( # 保留你原有的输入日期区间过滤逻辑,不需要可以删掉 start_date__lte=input_end_date, end_date__gte=input_start_date ).filter( # 满足任意一个条件即属于「日期范围不在关联父模型范围内」的情况 Q(parent_model__isnull=True) | Q(parent_model__start_date__isnull=True) | Q(parent_model__end_date__isnull=True) | Q(start_date__lt=F("parent_model__start_date")) | Q(end_date__gt=F("parent_model__end_date")) )
逻辑说明
F("parent_model__start_date")用来直接在查询中引用关联父模型的start_date字段,不需要提前加载实例Q对象用来组合多条件的或逻辑:- 没有关联父模型的子实例
- 关联的父模型没有设置开始/结束日期
- 子实例的开始日期早于父模型的开始日期
- 子实例的结束日期晚于父模型的结束日期
如果你的业务规则中,父模型日期为空、或者子模型没有关联父模型的情况不需要纳入结果,删掉对应的Q条件即可。
内容的提问来源于stack exchange,提问作者user001
相关产品推荐
相关产品推荐

