Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:如何有效地查询关系_Python_Django_Performance_Django Queryset_Django Select Related - Fatal编程技术网

Python Django:如何有效地查询关系

Python Django:如何有效地查询关系,python,django,performance,django-queryset,django-select-related,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',

我有一个模型“预订”引用另一个模型“事件”与外键

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的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
但我很确定,就所需的数据库查询而言,这并不是解决我的问题的非常有效的方法

我曾经考虑过使用“与选择相关”的方法,但我没有想到在我的用例中如何从中受益


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

您可以在一行中完成:
Event.objects.filter(bookings\uu user=self.request.user)
您可以在一行中完成:
Event.objects.filter(bookings\uu user=self.request.user)
这是一种更干净的方法,谢谢。我在末尾添加了“.distinct()”,以便只获取一次事件。但这在查询方面有效吗?你能告诉我这会产生多少查询吗?啊,是的,可能需要一个明确的答案。这是一个查询,您可以通过
打印事件.objects.filter(bookings\uuu user=self.request.user)查看它。查询
。这是一个更简洁的方法,谢谢。我在末尾添加了“.distinct()”,以便只获取一次事件。但这在查询方面有效吗?你能告诉我这会产生多少查询吗?啊,是的,可能需要一个明确的答案。这是一个查询,您可以通过
print Event.objects.filter(bookings\uu user=self.request.user.query)查看它。