我有一个Timeslot
模型,其中start
和end
字段的类型为DateTimeField
。另一个班级Constraint
也有start
和end
个字段,但类型为TimeField
。
我可以按给定时间段的Constraint
和start
值过滤end
个对象:
Constraint.objects.filter(start=timeslot.start)
但现在我需要根据给定约束的值过滤Timeslot
。该方案具有多个时隙,可在整个时域中定义不同的日期时间范围,并且我希望选择现有constraint
指定的给定时间范围之外的时间段:
Timeslot.object.filter(Q(end__lte=constraint.start) | Q(start__gte=constranit.end))
例如,假设我有timeslots
时间为10月23日到10月29日,每天从10am
开始到1pm
结束。持续时间为1 hour
,因此每天将有3个时段,总共21个时段。
23 Oct, 10am-1pm (3 timeslots)
24 Oct, 10am-1pm (3 timeslots)
25 Oct, 10am-1pm (3 timeslots)
26 Oct, 10am-1pm (3 timeslots)
27 Oct, 10am-1pm (3 timeslots)
28 Oct, 10am-1pm (3 timeslots)
29 Oct, 10am-1pm (3 timeslots)
定义范围constraint
的{{1}}。我想选择该范围之外的11am-12pm
。结果将是timeslots
和10am
之间的时间段,以及11am
和12pm
end
的开头的时间段。
我不能这样做,因为它会产生1pm
。
为什么我可以根据TypeError
值过滤TimeField
,但不能相反?什么是解决方法呢?
答案 0 :(得分:0)
在Django 1.11中,您可以使用__time-api来匹配时间段的时间部分和约束模型的时间,如下所示:
Timeslot.objects.filter(Q(end__time__lte=constraint.start)|Q(start__time__gte=constraint.end))
如果您不想/无法更新您的django版本,您仍然可以使用__hour and __minute-api进行过滤:
Timeslot.objects.filter(Q(end__hour__lte=constraint.start.hour,end__minute__lte=constraint.start.minute)|Q(start__hour__gte=constraint.end.hour, start__minute__gte=constraint.end.minute))
另外,你可以考虑使用exlude()而不是filter()来提高代码的可读性