0

モデル オブジェクトが他の多くのオブジェクトの集合体である場合、Foreign Key または Many To Many を介して、そのオブジェクトのクエリセットを反復すると、関連するオブジェクトへの個々のクエリが発生しますか?

私が持っているとしましょう

class aggregateObj(models.Model):
  parentorg = models.ForeignKey(Parentorgs)
  contracts = models.ForeignKey(Contracts)
  plans = models.ForeignKey(Plans)

そして実行

objs = aggregateObj.objects.all()

を反復処理する場合、 、またはフィールドobjs内で行われるすべての比較は、そのオブジェクトに対する個別のクエリになりますか?parentorgcontractsplan

4

2 に答える 2

3

はい、デフォルトでは、すべての比較で個別のクエリが作成されます。これを回避するには、select_related(prefetch_related関係は「逆方向」です) QuerySet メソッドを使用して、最初のクエリですべての関連オブジェクトをフェッチします。

外部キー関係を自動的に「たどる」QuerySet を返し、クエリの実行時に追加の関連オブジェクト データを選択します。これはパフォーマンス ブースターであり、結果として (場合によってははるかに) クエリが大きくなりますが、後で外部キー リレーションシップを使用する際にデータベース クエリが必要なくなることを意味します。

于 2013-06-17T10:05:23.033 に答える
1

はい。これを防ぐには、select_relatedクエリ時に JOIN を介して関連データをフェッチするために使用します。

于 2013-06-17T10:05:39.707 に答える