我有一个带有2个日期时间字段的模型,如下所示:
class Booking(models.Model):
start_date = models.DateTimeField()
end_date = models.DateTimeField()
...
作为测试数据,我在17:30之前预订了2次start_date,在17:45之后预订了2次,所有这些预订都在同一天(2018年5月8日)。我试图使用__time查找过滤预订,以便在17:30之前(包括)查找所有预订。我的查询集是:
bookings = Booking.objects.filter(date__time__lte=datetime.time())
其中datetime.time打印为
datetime.time(17, 30)
并且日期时间的日期部分与预订日期相同。上面的查询返回一个空的查询集,但如果我使用相同的查询,除了过滤时间大于datetime.time(),即
bookings = Booking.objects.filter(date__time__gte=datetime.time())
queryset返回所有预订(在17:30之后它应该只返回带有start_date的2个预订)。有人可以向我解释如何使用__time查找吗?
修改 我将过滤器更新为
bookings = Booking.objects.filter(start_date__time__lte=datetime.time())
,结果是一样的。当我打印预订的值时,值为:
print Booking.objects.all().values('date', 'end_date')
[
{'start_date': datetime.datetime(2018, 5, 8, 16, 30, tzinfo=<DstTzInfo 'Africa/Harare' CAT+2:00:00 STD>), 'end_date': datetime.datetime(2018, 5, 8, 17, 0, tzinfo=<DstTzInfo 'Africa/Harare' CAT+2:00:00 STD>)},
{'start_date': datetime.datetime(2018, 5, 8, 17, 0, tzinfo=<DstTzInfo 'Africa/Harare' CAT+2:00:00 STD>), 'end_date': datetime.datetime(2018, 5, 8, 17, 30, tzinfo=<DstTzInfo 'Africa/Harare' CAT+2:00:00 STD>)},
{'start_date': datetime.datetime(2018, 5, 8, 17, 45, tzinfo=<DstTzInfo 'Africa/Harare' CAT+2:00:00 STD>), 'end_date': datetime.datetime(2018, 5, 8, 18, 15, tzinfo=<DstTzInfo 'Africa/Harare' CAT+2:00:00 STD>)},
{'start_date': datetime.datetime(2018, 5, 8, 17, 45, tzinfo=<DstTzInfo 'Africa/Harare' CAT+2:00:00 STD>), 'end_date': datetime.datetime(2018, 5, 8, 18, 15, tzinfo=<DstTzInfo 'Africa/Harare' CAT+2:00:00 STD>)}
]
编辑2 我忘了提到我需要获得同一天的预订。正如siddhant0905建议我使用日期时间过滤了查询集,并添加了一个额外的过滤器以确保它在同一天。以下对我有用:
bookings = Booking.objects.filter(Q(start_date__date=datetime.date()) & Q(start_date__lte=datetime))
答案 0 :(得分:1)
我认为你应该比较完整的日期时间对象,而不仅仅是比较时间部分。 调试查询返回的时间的“类型”以及提供它以进行比较的时间类型。两者都应该相同。 Django shell可以提供很大的帮助。