我有两个字段的模型:
class Event(models.Model):
date = models.DateField(_(u'Date'))
time = models.TimeField(_(u'Time'))
我需要找到所有日期和时间都在24小时之内的对象。
我可以在使用DateTime字段时执行此操作,但我不确定如何在字段分隔时实现此目的。提前谢谢。
答案 0 :(得分: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
答案 1 :(得分:8)
正如您所述,您可以使用DateTimeField
执行所需操作,但现在使用单独的字段,我了解您的问题是如何将它们组合在一起。
Looking at the docs for DateField - 您的date
变量是datetime.date
个实例,similarly for TimeField time
是datetime.time
。您可以使用combine()
datetime.datetime
import datetime as dt
datetime = dt.datetime.combine(date,time)
您现在拥有了DateTimeField
的日期时间对象。你在问题中说你可以在24小时后从那里开始做,虽然如果你需要明确的话,请在评论中告诉我。
警告 我combine
会失败,其中一个字段是None
- 你说这不会发生,所以我没有'添加了任何错误检查或验证。
我发现问题可能不是组合,而是将计算字段添加到Event
对象。您可以查看this Q&A或this。总之,您可以在类中的函数中定义计算值,然后将其设置为property - 使用装饰器或函数调用。有example in the docs,适合您的情况:
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
的行为方式相同。
答案 2 :(得分: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)