在Django的ForgeinKeys中,select_related用于填充* _set变量?

时间:2011-08-11 11:37:04

标签: python django performance django-models django-queryset

我有一些像这样简单的Django模型:

class Event(models.Model):
    # some stuff

class Price(models.Model):
    event = models.ForgeinKey(Event)

即。每个Event都有1个或多个Price

我选择了这样的事件:events = Event.objects.filter(…),然后循环遍历它们for event in events:,在循环内我需要访问每个事件的所有Price个对象(即{ {1}})但是,它为每个事件执行新的SQL查询。我有成千上万的事件,这导致成千上万的查询。有没有什么方法可以一次性为每个事件预填充event.price_set

我尝试在QuerySet中添加price_set,但它不起作用(我仍然可以看到Django调试工具栏中的所有查询)。当然有一些方法可以在原始SQL查询上进行连接,这会在一个查询中引入所有select_related及其Event吗?

2 个答案:

答案 0 :(得分:2)

看看:https://github.com/lilspikey/django-batch-select/ 只需2个查询(1个用于事件,1个用于价格),它将允许您获得所需的内容

答案 1 :(得分:1)

作为对此问题的其他人的暗示:

Django 1.4(在撰写本文时尚未发布),prefetch_related作为select_related的补充,这正是我在这里所要求的。