5

次のモデルがある場合:

class Fubar(models.Model):
    name = models.CharField()

class Related(models.Model):
    fubar = models.ForeignKey(Fubar)

.related_setを使用してRelatedにアクセスした場合、ORMが親Fubarオブジェクトを魔法のようにキャッシュすることを期待します。

fubar = Fubar.objects.all()[0]
related = fubar.related_set.all()[0]
related.fubar

このコンテキストでは、related.fubarを最適化して、RelatedManagerを呼び出したのと同じオブジェクトにすることができるため、結果は3つのクエリになります。

4

2 に答える 2

2

なぜこれがうまくいかないのかはわかりませんが(魔法の削減を除いて)、次のようにして余分なクエリを簡単に回避できます

fubar.related_set.select_related('fubar')[0]
于 2012-01-31T10:17:36.173 に答える
0

django 1.4 では、指定されたルックアップごとに関連オブジェクトを単一のバッチで自動的に取得するprefetch_relatedが導入されています。

于 2012-01-31T10:18:25.873 に答える