Python Django午夜后营业时间时间字段比较错误

Python Django午夜后营业时间时间字段比较错误,python,django,Python,Django,我有一个需要比较的营业时间,如果营业时间超过午夜,我会得到不完整的结果 我的模型 class Hours(models.Model): dayofweek = models.ForeignKey('Dayofweek') opentime = models.TimeField(blank=True, null=True) closetime = models.TimeField(blank=True, null=True) ... 如果我只需要显示小时数,一切正常,例如: 星期

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

我的模型

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
for
exists()

我的问题

if Hours.objects.filter(
            business__id=id,
            dayofweek__pyday=dt, 
            opentime__lte=mytime, 
            closetime__gte=mytime).exists():
    #do something

有什么建议可以告诉Django凌晨2点是下午5点之后吗?

一天可以有多个时段,但不管怎样,一天都会在晚上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,所以这只是一些伪代码和我将使用的另一种方法。

通过两个查询使用如何:

一个用于简单案例(打开时间 这就是我解决相同情况的方法,在你的filter()子句中使用它(并用你的名字替换我的daily_start/ends_at,用now().time()或其他什么替换我的daily_time)。逻辑与这里的其他答案类似,比较必须根据范围是否跨越午夜而有所不同


您还需要使用包含其他筛选器参数的Q()子句。

为什么不执行2个查询…(下午5点-11:59点)| |(上午12点-凌晨2点)?听起来api并没有设置为满足您的需要?我猜您可以菊花链2个筛选器…Hours.objects.filter().filter().exists()那么,如果营业时间是下午5点到10点,那该怎么办呢?例如,该应用程序正在检查下午5点到10点的营业时间是否在晚上9点开放?请注意:如果当前时间是凌晨2点,您也会遇到同样的问题:关闭时间会匹配,但不是开放时间。有些离题,为什么您决定将dayofweek设置为外键.IntegerField和选项=((1,“星期一”),(2,“星期二”),…Maxim,其主要原因是,当我在DB中使用它时,我可以每天都有额外的字段。例如,除了常规名称
Monday
,我还有
Mon
的缩写版本,我还存储Python日,其中周日为
0
,因此我不必运行任何转换。谢谢您的反馈。T他的方法肯定会奏效。我想唯一的缺点是,我必须先运行另一个查询,以获取开始和结束时间,这样我才能比较这些时间。你只需查看api文档,看看它是否符合你的要求,但这是我解决该问题的方法。如果有什么不使用hours.objects…如果你能做到的话solute UTC time,这将更有意义,您可以按照您想要的方式查询。查看api文档。我认为您实际上使用了错误的查询服务。感谢您的替代方案,我也一定会尝试此解决方案!非常感谢您的帮助!我遇到了类似的问题,这正是我正在考虑解决的问题。这是我的想法e不起作用,因为关键字opentime\uu lte在filter子句中重复了两次。
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():
(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))