Julian Popov
Julian Popov

Reputation: 17461

Not sure how to use Django models

With this models

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')

How to effectively get all Events objects that have at least one EventSchedule which is active and within sales start and end period?

The filter for EventSchedule objects is

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

but I need Event objects instead of EventSchedule objects?

Upvotes: 1

Views: 85

Answers (2)

Daniel Roseman
Daniel Roseman

Reputation: 599470

Use the double-underscore syntax to traverse relations:

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

Edited Actually, the above code will show events which have schedules which match any of those criteria, even if they are not the same schedule. This actually requires a sub-query, which can be done like this:

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

Third try is this any better?

Event.objects.filter(id__in=EventSchedule.objects.values_list('event').filter(
    (active=True, sales_start__lte=now, sales_finish__gte=now)).distinct()

Upvotes: 3

anhtran
anhtran

Reputation: 2034

I just think simple:

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)

Upvotes: 0

Related Questions