我有一个工作时间需要比较,如果营业时间超过午夜,我会得到不完整的结果
我的模特
class Hours(models.Model):
dayofweek = models.ForeignKey('Dayofweek')
opentime = models.TimeField(blank=True, null=True)
closetime = models.TimeField(blank=True, null=True)
...
如果我只需要显示小时,一切正常就行了: 周六下午5点 - 凌晨2点
现在,当我尝试查询营业时间是否开放时,那些过去午夜的人将会False
返回exists()
:
我的查询
if Hours.objects.filter(
business__id=id,
dayofweek__pyday=dt,
opentime__lte=mytime,
closetime__gte=mytime).exists():
#do something
如何告诉Django凌晨2点是在下午5点之后的任何建议?
答案 0 :(得分:1)
一天可以有多个时段,但无论如何,这一天都会在晚上11:59结束。如果延续到第二天,您必须打破时间间隔。所以过滤器的逻辑就像这样......
# Spans over 2 days
if opentime > closetime:
Hours.objects.filter(
business_id=id,
dayofweek_pyday=dt,
opentime_tye=myOpenTime,
closetime_gte=11:59:99
).exists() ||
Hours.objects.filter(
business_id=id,
# Next date
dayofweek_pyday=dt + 1,
opentime_tye=00:00:00,
closetime_gte=myCloseTime
).exists()
# Spans over 1 day
else:
Hours.objects.filter(
business__id=id,
dayofweek__pyday=dt,
opentime__lte=myOpentime,
closetime__gte=myClosetime).exists()
我不知道django所以这只是一些伪代码和我会使用的替代方法。
答案 1 :(得分:1)
如何通过两个查询使用F and Q expressions:
一个用于简单情况(开放时间< =关闭时间)
Hours.objects.filter(
opentime__lte=F('closetime'),
business__id=id,
dayofweek__pyday=dt,
opentime__lte=mytime,
closetime__gte=mytime).exists():
和一个奇数情况(关闭时间<开放时间)
Hours.objects.filter(
opentime__gt=F('closetime'),
business__id=id,
dayofweek__pyday=dt,
Q(opentime__lte=mytime) | Q(closetime__gte=mytime)).exists():
答案 2 :(得分:0)
(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))
这就是我解决相同情况的方法,在您的filter()子句中使用它(并用您的名字替换我的daily_starts / ends_at,并用now()。time()或其他内容替换now_time)。逻辑就像这里的其他答案一样,根据范围是否超过午夜,比较必须有所不同。
您还需要&带有包含其他过滤器参数的Q()子句。