Make組ブログ

Python、Webアプリや製品・サービス開発についてhirokikyが書きます。

Djangoで親の親のモデルを1クエリーで取る

Djangoのモデルから親のモデルを取ると(select_relatedなどしていないと)1クエリー実行されてしまいます。 以下のように、親のさらに親を取ろうとすると2クエリー実行されます。

me.parent.parent

me.parent の時点で1クエリー実行されて、 parent.parent の時点で2クエリー目が実行されます。 各クエリーでは親の全カラムの値も取るので、親の親だけが必要な場合は効率が悪いです。

この場合、以下のように子供の子供のIDを指定して取るように置き換えると1クエリーで取れます。

Grandpa.objects.get(children__children__id=me.id)

ObjectDoesNotExist とか MultipleObjectReturned には気をつけて。