我在我的数据库中存储一个对象,其时间段如下:
class MyClass(models.Model):
start_time = models.TimeField(null=True, blank=True)
stop_time = models.TimeField(null=True, blank=True)
这里的想法是,在查询端点时,服务器将只返回当前时间在start_time和stop_time之间的对象。
注意:start_time和stop_time是一天中的任意时间,可以跨越午夜,但不会超过24小时。
我试过了
currentTime = datetime.now().time()
MyClass.objects.filter(stop_time__gte=currentTime, start_time__lte=currentTime)
但这并不能说明时间跨越午夜的时间。
我确定必须有一个简单的解决方案,但网络搜索让我毫无结果。有谁知道这样做的好方法?
答案 0 :(得分:2)
经过多次挖掘,我发现这需要两个查询:一个用于开始时间小于停止时间(常见情况),一个用于何时大于停止时间(不常见,之后) - 午夜案例。)
以下是代码:
currentTime = datetime.now().time()
#Returns a list of menus that have start times less than their stop times
list_1 = MyClass.objects.filter(Q(start_time__lte=F('stop_time')), Q(start_time__lte=currentTime), stop_time__gte=currentTime)
#Returns the menus that have start times greater than their stop times (span midnight)
list_2 = MyClass.objects.filter(Q(start_time__gt=F('stop_time')), Q(start_time__lte=currentTime) | Q(stop_time__gte=currentTime))
concat_list = list_1 | list_2
concat_list = concat_list.order_by('-priority')
因为我们使用“|”为了连接列表,我们可以保留与原始列表相同的功能,例如“order_by()”。仅当连接的数据来自同一模型集时才会出现这种情况。
参考文献:
Django After Midnight Business Hours TimeField Comparison Error
答案 1 :(得分:0)
仅供参考,我也将其发布在这里(之前我也在其他链接的问题中回答了此问题)。您需要在filter()子句中使用类似的内容,以处理午夜穿越和非午夜穿越两种情况所需的不同比较。用开始/停止时间替换daily_starts / ends_at,用currentTime替换now_time。
(Q(daily_starts_at__lte=F('daily_ends_at')) &
Q(daily_starts_at__lte=now_time, daily_ends_at__gte=now_time)) |
(Q(daily_starts_at__gt=F('daily_ends_at')) &
(Q(daily_starts_at__lte=now_time) | Q(daily_ends_at__gte=now_time))
如果需要,您还需要&带有Q()子句,其中包含其他过滤器参数。