【问题标题】:How to use Django __time lookup in a queryset如何在查询集中使用 Django __time 查找
【发布时间】:2018-05-23 15:22:54
【问题描述】:

我有一个带有 2 个日期时间字段的模型,如下所示:

class Booking(models.Model):
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    ...

作为测试数据,我有 2 个 start_date 在 17:30 之前的预订和 2 个在 17:45 之后的预订,都在同一天(2018 年 5 月 8 日)。我正在尝试使用 __time 查找过滤预订,以查找 17:30 之前(包括)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())

查询集返回所有预订(它应该只返回 start_date 在 17:30 之后的 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))

【问题讨论】:

  • 在您的filter 中您使用date,但您指定了start_dateend_date
  • 也许显示您填写的值会很有用(即Booking.objects.all().values_list('begin_date', 'end_date'))。
  • @WillemVanOnsem 我更新了查询以过滤正确的字段,但结果仍然相同。我将更新帖子以包含打印的值
  • @willem 我现在也只想过滤开始日期,以及以后用例的结束日期,但它们的过滤将是相似的,我只需要让它工作首先是开始日期。
  • 这不是时区问题吗?如果将时区添加到数据中会怎样?

标签: python django django-queryset


【解决方案1】:

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

【讨论】:

  • 虽然这可能是问题所在,但您能否提供示例代码来说明如何做到这一点?
  • 是的,我同意,django shell 在调试和测试代码方面非常棒。我确实打印了类型,我提供的查询对象和时间都是 datetime.time() 实例。
  • 我认为@siddhant0905 是对的,你应该尝试整个datetime,而不仅仅是time
  • 在使用整个日期时间时确实有效。由于这适用于我的用例,我将把这个答案标记为正确,但是我仍然对为什么 __time 过滤器不能以同样的方式工作感到困惑。
  • 嘿@Jcraine,因为你发现这个答案是正确的,所以你的支持将不胜感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多