如何在查询集

时间:2018-05-23 15:22:55

标签: python django django-queryset

我有一个带有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))

1 个答案:

答案 0 :(得分:1)

我认为你应该比较完整的日期时间对象,而不仅仅是比较时间部分。 调试查询返回的时间的“类型”以及提供它以进行比较的时间类型。两者都应该相同。 Django shell可以提供很大的帮助。