Reputation: 17461
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
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
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