【问题标题】:Django: how to query relations effectivelyDjango:如何有效地查询关系
【发布时间】:2016-12-25 04:47:04
【问题描述】:

我有一个模型“Booking”用外键引用另一个模型“Event”。

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”方法,但我不知道如何在我的用例中从中受益。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 这是一种更简洁的方法,谢谢。我在最后添加了“.distinct()”,只获取一次事件。但这在查询方面有效吗?你能告诉我这会产生多少查询吗?
    • 啊,是的,可能需要一个不同的地方。这是一个单一的查询,您可以通过print Event.objects.filter(bookings__user=self.request.user).query 看到它。
    猜你喜欢
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2017-02-02
    • 1970-01-01
    • 2011-09-20
    • 2013-08-26
    相关资源
    最近更新 更多