![](/img/trans.png)
[英]Given a queryset of objects, for each one, how can I find the set of all objects that ForeignKey to that object?
[英]How can I get all of the django foreignkey objects in one shot?
上下文: 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,
})
foo_list = Foo.objects.filter(params).select_related()
做這份工作。 其余代碼將保持不變,但是
for f in foo_list:
f.bar
將使用緩存的對象
是的,您可以在查詢集(https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.select_related)上使用select_related
方法,該方法將在初始查詢中為您加入。 因此,就您而言,類似:
foo_list = Foo.objects.filter(params).select_related()
如果您有很深的鏈接模型鏈,那么也有必要限制深度,以便僅獲取條形對象(而不是除.select_related(depth=1)
之外的任何其他鏈接.select_related(depth=1)
使用關系查找的例如:
foo_list = Foo.objects.filter(params).values('field','bar__barField','bar__barField2')
這將在一個查詢中完成這項工作,並且結果集也將具有必填字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.