查找日期和时间小于当前时间24小时的对象

12

我有一个包含两个字段的模型:

class Event(models.Model):
    date = models.DateField(_(u'Date'))
    time = models.TimeField(_(u'Time'))

我需要找到所有时间距离当前24小时的对象。

当使用DateTime字段时,我可以做到这一点,但是当字段分开时,我不确定如何实现。谢谢。


由于许多原因。例如,我有一个表单,用户可能或可能不提供时间等信息。 - dease
我看到了,@rnevius已经回答了 =)。 - argaen
他已经删除了他的回答 :) - dease
2
@dease:如果有人没有提供日期或时间,会发生什么?这些字段现在不可为空,所以我想知道您正在寻找什么样的行为。 - Wolph
你是想处理跨越夏令时的转换,所以只是寻找明天同一时间,还是真正意义上的24小时后? - Peter Brittain
显示剩余2条评论
3个回答

12

对于简单情况(虽然不确定是否所有情况都是简单的),这应该可以解决问题:

import datetime

today = datetime.datetime.now()
tomorrow = today + datetime.timedelta(days=1)

qs_today = queryset.filter(
    date=today.date(),
    time__gte=today.time(),
)
qs_tomorrow = queryset.filter(
    date=tomorrow.date(),
    time__lt=tomorrow.time(),
)
qs = qs_today | qs_tomorrow

9

您提到使用DateTimeField可以实现所需功能,但是现在因为有不同的字段,我了解您的问题是如何将它们组合在一起。

查看DateField文档 - 您的date变量是datetime.date实例,类似于TimeFieldtimedatetime.time。您可以使用combine()将其转换为datetime.datetime

import datetime as dt
datetime = dt.datetime.combine(date,time)

您现在拥有了与DateTimeField相同的日期时间对象。您在问题中提到可以从那里进行24小时后的计算,如果需要明确说明,请在评论中告诉我。 注意:如果其中一个字段为None,则combine将失败 - 您声明这不可能发生,因此我没有添加任何错误检查或验证。

编辑

我突然想到问题可能不在于组合,而是将计算字段添加到“Event”对象上。您可以参考这个Q&A这个。总的来说,在类中的一个函数中定义计算值,然后将其作为属性进行定义 - 可以使用装饰器或函数调用。文档中有一个适用于您情况的示例
    def _get_datetime(self):
       '''Returns a combination of date and time as a datetime'''
       return dt.datetime.combine(self.date,self.time)
    datetime = property(_get_datetime)

这应该表现出与您期望的 DateTimeField 相同的行为。

5

您可以使用Q对象来搜索“当前时间之后的昨天或当前时间之前的今天”:

from django.db.models import Q
from .models import Event
from datetime import datetime, timedelta

def get_event_during_last_day():
    now = datetime.now()
    today = now.date()
    yesterday = (now - timedelta(day=1)).date()
    time = now.time()

    query_yesterday = Q(date=yesterday, time__gt=time)
    query_today = Q(date=today, time__lt=time)

    return Event.objects.filter(query_yesterday | query_today)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接