概要
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を使います。