午夜营业时间后的Django TimeField比较错误

时间:2015-06-05 22:25:00

标签: python django

我有一个工作时间需要比较,如果营业时间超过午夜,我会得到不完整的结果

我的模特

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点之后的任何建议?

3 个答案:

答案 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()子句。