我有一个PostgreSQLDateRange
字段的模型:
class MyModel(models.Model):
date_range = DateRangeField()
如果我想查询这个,看看是否有另一个日期重叠,这很容易:
MyModel.objects.filter(date_range__overlap=other_date)
但是,如果我已经构建了一个DateRange
对象列表,我如何搜索列表,询问列表的相同事情(而不是查询集)。例如:"此日期范围是否与此列表中的任何日期范围重叠?":
mylist = [DateRange([2021-10-04, 2021-10-05]), DateRange([2022-10-04, 2022-10-05])]
for dr in mylist:
dr.overlap(query_date) # fails
注意:DateRange
对象没有属性overlap
/docs。
我们知道,如果e1≤s2或e2≤s1与si和ei片段i的开头和结尾分别为s和ei,则两个datetime
s不重叠。
def is_overlap(dr1, dr2):
return dr1.upper > dr2.lower and dr2.upper > dr1.lower
接下来我们可以发现如果任何项目重叠:
any(is_overlap(query_date, dr) for dr in mylist)
或者我们可以构造一个包含所有与query_date
重叠的DateRange
的列表:
[dr for dr in mylist if is_overlap(query_date, dr)]