如何一次性获取所有django foreignkey对象?

时间:2011-09-15 18:15:07

标签: python mysql django

上下文:Foo是一个具有指向Bar对象的foreignKey字段的类。多个Foo可以引用相同的Bar。 (多对一)

我需要引用Foo对象的外键(Bar.fieldBar.field2)的几个字段,但似乎每次我这样做都会运行一个单独的查询。

因此,引用这些字段可能需要永远。

有没有办法在单个查询中获取所有 Bar个对象?或者有更好的方法加快速度吗?

foo_list = Foo.objects.filter(params) # takes 0.001 sec, returns 10k objects

result = []

for f in foo_list:

    # this part takes 40 seconds due to the huge number of queries 
    bar = f.bar # Foo contains a foreignKey reference to the Bar class

    result.append({
        "field": f.field,
        "barField": bar.barField,
        "barField2": bar.barField2,

        # this way was even worse
        # "barField": f.bar.barField,
        # "barField2": f.bar.barField2, 
    })

3 个答案:

答案 0 :(得分:3)

foo_list = Foo.objects.filter(params).select_related()

完成这项工作。其余的代码将保持不变,但

for f in foo_list:
    f.bar

将使用缓存的对象

答案 1 :(得分:1)

是的,您可以在查询集上使用select_related方法(https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet。 select_related),它将在初始查询中为您执行连接。所以在你的情况下,像:

foo_list = Foo.objects.filter(params).select_related()

如果您有一个非常深的链接模型链,那么也可能值得限制深度,以便您只获得条形对象(而不是.select_related(depth=1)

之外的任何其他链接

答案 2 :(得分:0)

使用relationship查找例如:

foo_list = Foo.objects.filter(params).values('field','bar__barField','bar__barField2')

这将在一个查询中完成工作,结果集也将包含必填字段。