Django:如何有效地查询关系

时间:2016-08-18 09:50:40

标签: python django performance django-queryset django-select-related

我有一个模特"预订"引用另一个模型"事件"用外键。

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"方法,但我没有想出如何在我的用例中从中受益。

我的问题是:你怎么解决这个问题?做这样的事情最有效的方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以在一行中执行此操作:Event.objects.filter(bookings__user=self.request.user)