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
forexists()
:
我的问题
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))