我正在尝试研究如何在Django中编写查询语句,以选择日期范围内发生的所有事件。事件的ManyToMany
字段schedules
指向一个或多个Schedule对象。基本上它看起来像这样:
class Event(models.Model):
name = models.CharField(max_length=255)
schedules = models.ManyToManyField(Schedule)
class Schedule(models.Model):
from_date = models.DateTimeField(default="1970-01-01", blank=True)
to_date = models.DateTimeField(default="1970-01-01", blank=True)
class Meta:
ordering = ('from_date', 'to_date',)
所以一个事件可以有很多这样的预定场合:
Event | from_date | to_date
----------------------------------
event1 | 2013-01-01 | 2013-01-02 (1)
| 2013-01-04 | 2013-01-07 (2)
| 2013-01-01 | 2013-04-30 (3)
event2 | 2013-01-01 | 2013-01-03 (4)
| 2013-01-02 | 2013-01-10 (5)
| 2013-02-10 | 2013-04-15 (6)
...
如果我的event1
之类的活动有schedule (3)
之类的时间表,我希望使用二月过滤器返回该事件。在这种情况下,还应返回event2
,因为它有schedule (6)
。
这是我尝试选择这些事件的方式:
events = Event.objects.filter(
Q(schedules__from_date__gte=from_date) &
Q(schedules__to_date__lte=to_date))
events = events.distinct()
当我尝试过滤掉2月份发生的日期范围内的所有事件时,这不会给我正确的结果:(2013-02-01,2013-02-28)
。
非常感谢任何帮助,谢谢。
答案 0 :(得分:1)
试试这样:
events = Event.objects.filter(
Q(schedules__from_date__gte=from_date) | Q(schedules__to_date__gte=from_date),
Q(schedules__to_date__lte=to_date) | Q(schedules__from_date__lte=to_date))
events = events.distinct()
希望它有所帮助! 有关Q类的完整说明,您可以看到docs here
至于逻辑,我们正在做的是在我们的“从日期”之后获得其日程安排START或FINISH的事件。如果它开始之后,我们需要START或FINISH日期低于我们的“迄今为止”。如果之前开始,我们需要它在间隔内完成,所以它也会满足条件。
解释起来有点复杂,我稍后会详细说明!