0

我有一个模型“预订”引用另一个模型“事件”与外键。Django:如何有效地查询关系

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

我希望得到一个用户已预订一组的所有事件,在ListView使用它。

我设法通过重写ListView的get_queryset方法来实现这一目标:

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 

但我敢肯定,那就是没有解决我的问题,需要数据库查询方面的一个非常有效的方式。

我曾考虑过使用“select_related”方法,但我没有想出如何从我的用例中获益。

我的问题是:你会如何解决这个问题?什么是最有效的方式来做这样的事情?

回答

2

您可以在一行做到这一点:Event.objects.filter(bookings__user=self.request.user)

+0

这是一个更简洁的方法,谢谢。我在最后添加了“.distinct()”,以便仅一次获取事件。但是在查询方面效率如何?你能告诉我这会产生多少查询吗? – setchock

+0

啊,是的,可能需要一个独特的。这是一个查询,你可以用'print Event.objects.filter(bookings__user = self.request.user).query'查看它。 –