setchock setchock - 1 year ago 104
Python Question

Django: how to query relations effectively

I have a model "Booking" referencing to another model "Event" with a foreign key.

class Event(models.Model):
title = models.CharField(_("title"), max_length=100)

class Booking(models.Model):
user = models.ForeignKey('auth.User', ..., related_name='bookings')
event = models.ForeignKey('Event', ..., related_name='bookings')

I want to get all the events a user has booked in a set, to use it in a ListView.

I have managed to accomplish that by overwriting ListView's get_queryset method:

def get_queryset(self):
user_bookings = Booking.objects.filter(user=self.request.user)
events = Event.objects.filter(id__in=user_bookings.values('event_id'))
return events

But I am quite sure, that that is not a very efficient way of solving my problem, in terms of needed database queries.

I have thought about using "select_related" method, but I didn't figured out how I could benefit from that in my usecase.

My question is: How would you solve this? What is the most efficient way to do something like this?

Answer Source

You can do this in one line: Event.objects.filter(bookings__user=self.request.user)

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download