Django按TimeField值过滤DateTimeField

时间:2017-10-30 11:35:20

标签: django django-1.8

我有一个Timeslot模型,其中startend字段的类型为DateTimeField。另一个班级Constraint也有startend个字段,但类型为TimeField

我可以按给定时间段的Constraintstart值过滤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。结果将是timeslots10am之间的时间段,以及11am12pm end的开头的时间段。

我不能这样做,因为它会产生1pm

为什么我可以根据TypeError值过滤TimeField,但不能相反?什么是解决方法呢?

1 个答案:

答案 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()来提高代码的可读性