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

dea*_*ase 12 python django django-models django-orm

我有两个领域的模型:

class Event(models.Model):
    date = models.DateField(_(u'Date'))
    time = models.TimeField(_(u'Time'))
Run Code Online (Sandbox Code Playgroud)

我需要找到日期和时间在24小时后的所有对象.

我可以在使用DateTime字段时执行此操作,但我不确定如何在字段分隔时实现此目的.提前致谢.

Wol*_*lph 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
Run Code Online (Sandbox Code Playgroud)


J R*_*ape 8

正如你所说,你可以用a做你想做的事DateTimeField,但是现在有了单独的字段,我理解你的问题是如何将它们结合起来.

查看DateField的文档 - 您的date变量是一个datetime.date实例,类似的TimeField time是一个datetime.time.您可以datetime.datetime通过使用将它们转换为acombine()

import datetime as dt
datetime = dt.datetime.combine(date,time)
Run Code Online (Sandbox Code Playgroud)

您现在拥有了日期时间对象DateTimeField.你在问题中说你可以在24小时后从那里开始,但是如果你需要明确的话,请在评论中告诉我.

警告combine会失败其中一个字段None- 你说这不可能发生,所以我没有添加任何错误检查或验证.

编辑

我发现问题可能不是组合,而是将计算字段添加到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)
Run Code Online (Sandbox Code Playgroud)

这应该与您期望的DateTimeField行为方式相同.


409*_*ict 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)
Run Code Online (Sandbox Code Playgroud)