上下文:Foo
是一个具有指向Bar
对象的foreignKey字段的类。多个Foo
可以引用相同的Bar
。 (多对一)
我需要引用Foo
对象的外键(Bar.field
和Bar.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,
})
答案 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')
这将在一个查询中完成工作,结果集也将包含必填字段。