2012-09-13 38 views
1

有了这个模型不知道如何使用Django模型

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) 

,但我需要事件对象EventSchedule的对象呢?

回答

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() 
+0

我认为,用这样的方式,我会得到每EventSchedule(将被复制事件的对象)的对象,我需要一种方式来组活动,所以我也可以对事件对象使用自动分页 –

+0

不,它只会给出唯一的事件。但是,我的解决方案存在单独的问题,所以我给出了上面的新版本。 –

+0

第二种解决方案几乎可以做什么,但有一个不必要的加入会破坏事物http://pastebin.com/MbBm5DvU –

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)