我正在努力在Django过滤器中逻辑地表示以下内容。我有一个“事件”模型和一个位置模型,可以表示为:
class Location(models.Model):
name = models.CharField(max_length=255)
class Event(models.Model):
start_date = models.DateTimeField()
end_date = models.DateTimeField()
location = models.ForeignKeyField(Location)
objects = EventManager()
对于给定的位置,我想选择今天发生的所有事件。我已经尝试了各种策略,通过EventManager中的'bookings_today'方法,但正确的过滤器语法让我感到困惑:
class EventManager(models.Manager):
def bookings_today(self, location_id):
bookings = self.filter(location=location_id, start=?, end=?)
date()失败,因为这会将时间归零,一天中的时间对应用程序至关重要,对于日期的最小值和最大值也是如此,并将它们用作书挡。此外,还有多种可能的有效配置:
start_date < today, end_date during today
start_date during today, end_date during today
start_date during today, end_date after today
我是否需要编写一整套不同的选项,或者是否有更简单和优雅的方法?
9条答案
按热度按时间g0czyy6m1#
您需要两个不同的
datetime
阈值-today_start
和today_end
:今天发生的任何事情都必须在 *
today_end
**之前开始,**在 *today_start
之后结束,所以:(P.S.将
DateTimeField
(而不是DateField
)称为foo_date
是令人恼火的误导-仅考虑start
和end
...)wlzqhblo2#
我看到的答案都没有时区意识。
你为什么不这样做呢
laawzig23#
你需要像这样使用一个范围:
yhxst69z4#
timezone.localtime(timezone.now()).date()
获取正确的日期。要获取今天发生的事件(
start
today),请执行以下操作:ghhaqwfi5#
因为它是一个
DateTimeField
使用start_date__date
oxosxuxt6#
我想排除是你的朋友!
xnifntxz7#
不如这样:
pub_date__gte=datetime(2005, 1, 1)
?使用_gte
和__lte
,使用链接方法将开始和结束限制在一天内。比如
self.filter(start__gte=datetime(2005, 1, 1)).filter(end__lte=datetime(2005, 1, 1))
。lte
表示小于等于,gte
表示大于等于。我在Django Doc找到的。
quhf5bfb8#
我有个建议
很难按今天日期过滤日期时间字段。即使你使用timezone.now()-你也不会得到正确的输出。因为timezone.now()也有时间。
日期时间字段有时间,所以即使你给出了正确的日期,时间也不会匹配。
所以
最好使用datefield进行基于日期的筛选
问题的答复:
3zwjbxry9#
因为它是一个
DateTimeField
使用start_date__date
并执行OR (|)
查询