1

有了这个模型

class Event(models.Model):
    name = models.CharField('Name', max_length = 200)

class EventSchedule(models.Model):
    event = models.ForeignKey(Event)
    active = models.BooleanField(default = False)
    sales_start = models.DateTimeField('Sales start')
    sales_finish = models.DateTimeField('Sales end')

如何有效地获取至少有一个 EventSchedule 处于活动状态且在销售开始和结束期间的所有事件对象?

EventSchedule 对象的过滤器是

filter(active = True, sales_start__lte = now, sales_finish__gte = now)

但我需要 Event 对象而不是 EventSchedule 对象?

4

2 回答 2

3

使用双下划线语法遍历关系:

Event.objects.filter(eventschedule__active=True, 
                     eventschedule__sales_start__lte=now,
                     eventschedule__sales_finish__gte=now)

编辑实际上,上面的代码将显示具有符合任何这些条件的时间表的事件,即使它们不是相同的时间表。这实际上需要一个子查询,可以这样完成:

Event.objects.filter(eventschedule__in=EventSchedule.objects.filter(
    (active=True, sales_start__lte=now, sales_finish__gte=now))

第三次尝试这样更好吗?

Event.objects.filter(id__in=EventSchedule.objects.values_list('event').filter(
    (active=True, sales_start__lte=now, sales_finish__gte=now)).distinct()
于 2012-09-13T13:02:46.443 回答
0

我只是觉得简单:

events = []
obj = EventSchedule.objects.filter(active=True, sales_start__lte=now, sales_finish__gte=now)
for i in obj:
    if not i.event in events:
          events.append(i.event)
于 2012-09-13T13:28:39.130 回答