Python 如何在一次拍摄中获得所有django foreignkey对象?

Python 如何在一次拍摄中获得所有django foreignkey对象?,python,mysql,django,Python,Mysql,Django,上下文:Foo是一个类,它有一个指向Bar对象的foreignKey字段。多个Foos可能指的是同一Bar。(多对一) 我需要引用Foo对象的foreignkey(Bar.field和Bar.field2)的几个字段,但似乎每次都会运行一个单独的查询 因此,引用这些字段可能需要很长时间 有没有一种方法可以在一个查询中获取所有条对象?还是有更好的方法来加速 foo_list = Foo.objects.filter(params) # takes 0.001 sec, returns 10k ob

上下文:
Foo
是一个类,它有一个指向
Bar
对象的foreignKey字段。多个
Foo
s可能指的是同一
Bar
。(多对一)

我需要引用
Foo
对象的foreignkey(
Bar.field
Bar.field2
)的几个字段,但似乎每次都会运行一个单独的查询

因此,引用这些字段可能需要很长时间

有没有一种方法可以在一个查询中获取所有
对象?还是有更好的方法来加速

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, 
    })
他做这项工作。代码的其余部分将保持不变,但是

for f in foo_list:
    f.bar
将使用缓存的对象

他做这项工作。代码的其余部分将保持不变,但是

for f in foo_list:
    f.bar

将使用缓存对象

是的,您可以在查询集上使用
select\u 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()

如果您有一个非常深的链接模型链,那么还应该限制深度,以便只获取条形图对象(而不是像
那样的任何其他链接)。选择相关(深度=1)
是的,您可以在查询集中使用
选择相关
方法(https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.select_related),它将在初始查询中为您执行联接。因此,在您的情况下,类似于:

foo_list = Foo.objects.filter(params).select_related()
如果您有一个非常深的链接模型链,那么还应该限制深度,以便只获取条形图对象(而不是像
那样的任何其他链接)。选择与之相关的(深度=1)

使用查找功能,例如:

foo_list = Foo.objects.filter(params).values('field','bar__barField','bar__barField2')
这将在一个查询中完成此任务,结果集也将包含必填字段。

使用查找的例如:

foo_list = Foo.objects.filter(params).values('field','bar__barField','bar__barField2')
这将在一个查询中完成这项工作,结果集也将包含必需的字段