Python 如何在queryset中使用Django\uuu时间查找

Python 如何在queryset中使用Django\uuu时间查找,python,django,django-queryset,Python,Django,Django Queryset,我有一个带有2个datetime字段的模型,如下所示: class Booking(models.Model): start_date = models.DateTimeField() end_date = models.DateTimeField() ... 作为测试数据,我在同一天(2018年5月8日)进行了两次预订,开始日期为17:30之前,两次预订时间为17:45之后。我正在尝试使用时间查找筛选预订,以查找17:30之前(包括17:30之前)的所有预订。我的查询

我有一个带有2个datetime字段的模型,如下所示:

class Booking(models.Model):
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    ...
作为测试数据,我在同一天(2018年5月8日)进行了两次预订,开始日期为17:30之前,两次预订时间为17:45之后。我正在尝试使用时间查找筛选预订,以查找17:30之前(包括17:30之前)的所有预订。我的查询集是:

bookings = Booking.objects.filter(date__time__lte=datetime.time())
其中datetime.time打印为

datetime.time(17, 30)
日期时间的日期部分与预订日期相同。上面的查询返回一个空查询集,但是如果我使用相同的查询,除了过滤大于datetime.time()的时间,即

queryset返回所有预订(其中只返回开始日期在17:30之后的2个预订)。有人能给我解释一下时间查找是如何使用的吗

编辑 我将过滤器更新为

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>)}
]

我认为您应该比较完整的datetime对象,而不仅仅是比较时间部分。 调试查询返回的时间的“类型”以及提供它以进行比较的时间类型。两者应该是相同的。
Django shell非常有用。

在您的
过滤器中使用
日期
,但您指定了
开始日期
结束日期
?显示您填写的值(即
Booking.objects.all().values\u列表(“开始日期”、“结束日期”)
)可能会很有用@WillemVanOnsem I更新了查询以筛选正确的字段,但结果仍然相同。我将更新帖子以包含这些值printed@willem我现在也只想过滤开始日期,以后的用例过滤结束日期,但两者的过滤是相似的,我只需要先让它在开始日期工作。这难道不是一个时区问题吗?如果您将时区添加到数据中会怎么样?虽然这可能是个问题,但您能否提供示例代码来说明如何做到这一点?是的,我同意,django shell在调试和测试代码方面非常棒。我确实打印了类型,并且我提供的查询对象和时间都是datetime.time()实例。我认为@siddhant0905是正确的,您应该尝试整个
datetime
,而不仅仅是
time
,它在使用整个datetime时确实有效。因为这适用于我的用例,所以我将把这个答案标记为正确的,但是我仍然不明白为什么时间过滤器不能以同样的方式工作。嘿@Jcraine,因为你发现这个答案是正确的,所以我非常感谢你的支持。
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>)}
]
bookings = Booking.objects.filter(Q(start_date__date=datetime.date()) & Q(start_date__lte=datetime))