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')
这将在一个查询中完成这项工作,结果集也将包含必需的字段