【发布时间】:2015-09-01 09:07:40
【问题描述】:
我正在 Django 中制作调度程序,但在过滤每周日历视图的事件时遇到问题。日历支持多日活动,而我当前的过滤器不适用于此每周视图。
这是我的模型:
class Event(models.Model):
title = models.CharField(max_length=40)
start = models.DateTimeField()
end = models.DateTimeField()
description = models.TextField()
all_day = models.BooleanField(default=False)
recuring = models.BooleanField(default=False)
recuring_end = models.DateTimeField(blank=True, null=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return '/cab/event/%i/' % self.id
我正在尝试过滤给定一周内发生的事件。对于单日活动,我会做类似的事情。
events = Event.objects.order_by('start').filter(Q(start__gte=monday) | Q(end__lte=sunday))
这可以检索一周内发生的所有单日事件。它也适用于在给定一周内开始或停止的多日事件。问题在于检索在一周之前开始并在一周之后完成但确实跨越一周的对象。
我的想法是尝试过滤掉任何超过 9 天的事件(即从前一周的星期日开始到下周的星期一结束),因为我知道这些事件很少见,不会完全破坏性能。我想不指定日期范围这样做,因为这不是动态的。
为了尽量减少对性能的影响,我尝试使用 F 表达式来评估事件的持续时间以及事件的开始和结束。我的第一个想法是做类似的事情:
my_events = Event.objects.order_by('start').filter(Q(start__gte=monday) | Q(end__lte=sunday) | Q( (F('end_day') - F('start_day')) >= 9 ) )
但我收到错误'bool' object is not iterable
也试过了:
my_events = Event.objects.order_by('start').filter(Q(start__gte=monday) | Q(end__lte=sunday) | Q( (F('end_day') - F('start_day')) >= datetime.timedelta(days=9) ) )
但是得到can't compare datetime.timedelta to ExpressionNode
任何人都煽动如何做这样的事情?
【问题讨论】:
-
@sobolevn 不重复,因为我不想指定日期范围
-
Q函数适用于=,不适用于>=,这就是您收到错误'bool' object is not iterable的原因 -
Q(end_day__gte=start_day+9)不起作用? -
@SylvainBiehler 不想要 9 天,而是 9 天或更多。
Q function是否有替代>=的方法?
标签: django django-models django-filter