概要
select_related
(とvalues()
メソッド)を使用することで、クエリの数を減らせることがわかったので、備忘録も兼ねて記載します。
サンプルコード解説
以下は、select_related
とvalues()
メソッドを使用して、Djangoモデル間の関連データを効率的に取得する方法のサンプルコード。
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
を使います。