簡體   English   中英

如何一次性獲得所有django外鍵對象?

[英]How can I get all of the django foreignkey objects in one shot?

上下文: 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, 
    })
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM