在Django中选择日期范围内的事件

时间:2014-01-09 19:56:10

标签: django django-models

我正在尝试研究如何在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)

非常感谢任何帮助,谢谢。

1 个答案:

答案 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日期低于我们的“迄今为止”。如果之前开始,我们需要它在间隔内完成,所以它也会满足条件。

解释起来有点复杂,我稍后会详细说明!