LoginSignup
0
1

【Python】select_related(とvaluesメソッド)を使用してクエリの数を最適化する

Posted at

概要

select_related(とvalues()メソッド)を使用することで、クエリの数を減らせることがわかったので、備忘録も兼ねて記載します。

サンプルコード解説

以下は、select_relatedvalues()メソッドを使用して、Djangoモデル間の関連データを効率的に取得する方法のサンプルコード。

models.py
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
# select_relatedとvaluesを使用して、Bookモデルのタイトルと関連するAuthorモデルの名前を取得する例
books = Book.objects.select_related('author').values('title', 'author__name')

for book in books:
    title = book['title']
    author_name = book['author__name']
    print(f"Title: {title}, Author: {author_name}")

この例では、Bookモデルのタイトルと関連するAuthorモデルの名前を取得しています。

select_related

select_relatedメソッド:関連するモデル(Author)のデータを事前に取得
・クエリの数を減らすことができます。以下も同じ意味ですが、この場合、それぞれのループで個別のクエリが発行されます。

books = Book.objects.all()

for book in books:
    title = book.title
    author_name = book.author.name
    print(f"Title: {title}, Author: {author_name}")

values

valuesメソッド:指定したフィールドの値を辞書の形式で取得
・今回は、'title''author__name'という2つのフィールドを取得
'author__name'は、関連するAuthorモデルのnameフィールドにアクセスする方法。valuesメソッドを使用するとクエリセットのオブジェクトではなく辞書が返されるため、フィールド名には__を使用して関連フィールドにアクセスする必要があります。
・値にアクセスするとき、モデルのインスタンスから取得しているわけではないのでbook.author.nameみたいにならないところもポイントですね。辞書のキー(book['author__name'])を使ってフィールドの値にアクセスします。

prefetch_related

ちなみに、上記のselect_relatedは外部キーや一対一の関係にあるモデルの間で使用されますが、多対多および一対多のオブジェクトを読み込む場合はprefetch_relatedを使います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1