Django ORM の select_関連付けと prefetch_関連付けを理解する
Django では、select_popular と prefetch_関連付けは、データベース クエリを最適化し、パフォーマンスを向上させるために使用される 2 つの手法です。どちらもテーブルを「結合」して関連データを取得する必要がありますが、その方法は異なります。
select_popular: SQL クエリでの結合
select_popular は SQL JOIN を実行します。単一のクエリですべての関連データを取得します。これにより結果セットは大きくなりますが、追加のクエリが不要になるため処理速度が速くなります。これは、ForeignKey リレーションシップなど、関連オブジェクトが 1 つまたは少数しか存在しないリレーションシップに最適です。一方、SQL クエリ内のテーブルを結合しません。代わりに、関連オブジェクトの主キー (ID) のみをフェッチし、個別のクエリを実行して Python で実際のデータを取得します。これにより SQL クエリが小さくなりますが、追加のクエリが必要になります。これは、ManyToManyFields や逆ForeignKeys など、関連するオブジェクトが多数あるリレーションシップに適しています。
Python 表現の違い
もう 1 つの重要な違いは、関連オブジェクトの Python 表現。 select_relative を使用すると、関連オブジェクトごとに Python で重複オブジェクトが作成されます。対照的に、prefetch_popular は、単一のオブジェクトを使用して各関連オブジェクトを表すため、メモリを節約できます。
使用ガイドライン
原則として、必要な関係には select_関連付けを使用します。少数の関連オブジェクトを取得します。多数の関連オブジェクトとの関係の場合は、prefetch_popular を使用します。
例
次の Django モデルを考えてみましょう。
すべてをフェッチするにはselect_popular を使用して、それぞれの著者と出版社を含む書籍を取得するには:
prefetch_popular を使用して、それぞれの書籍を含むすべての著者を取得するには:
<code class="python">class Publisher(models.Model): name = models.CharField(max_length=255) class Author(models.Model): name = models.CharField(max_length=255) publisher = models.ForeignKey(Publisher) class Book(models.Model): title = models.CharField(max_length=255) author = models.ForeignKey(Author)</code>
prefetch_popular の例では、Book オブジェクトはすぐには取得されません。 Author オブジェクトで使用できます。代わりに、書籍を取得するには author.book_set に明示的にアクセスする必要があります。
<code class="python">books = Book.objects.select_related('author', 'author__publisher').all()</code>
以上がselect_relative と prefetch_relative は Django ORM クエリをどのように最適化しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。