djangoを使う案件に参画したので、備忘録として学んだことをまとめていきます。(初めての投稿なので慣れない点ご了承ください)
以前の僕と同じようにselect_relatedってなに!?ってなる方は読んでみてください
select_related とは
djangok公式ドキュメントによると、
Returns a QuerySet that will “follow” foreign-key relationships, selecting additional related-object data when it executes its query. This is a performance booster which results in a single more complex query but means later use of foreign-key relationships won’t require database queries.
だそうです、、?日本語訳すると↓
クエリを実行する際に関連オブジェクトのデータを追加で選択し、外部キーのリレーションシップを "たどる "クエリセットを返します。これは、より複雑なクエリになりますが、後に外部キーリレーションシップを使用する際にデータベースクエリが不要になることを意味します。
んんー実際に見たほうが早いきがするので、コード見ていきましょう。
モデル定義
class Parent(models.Model):
father_name = models.CharField(max_length=20)
mother_name = models.CharField(max_length=20)
class Child(models.Model):
parent = models.ForeignKey('Parent', on_delete=models.CASCADE,)
name = models.CharField(max_length=20)
age = models.PositiveSmallIntegerField()
上記のようなモデル定義をしたとします(最低限)
このとき、特定の子供の親の名前と年齢を取得したいとしたらどうしますか?
select_relatedを使わないと
child = Child.objects.get(name="jon")
parent = child.parent
上記では、クエリが2回発行されてしまいます。
select_relatedを使うと
child = Child.objects.select_related("parent").get(name="jon")
parent = child.parent
上記では、クエリ1回でjonの親を取得することができます。
まとめ
上記の例のように、select_relatedを使うことで、外部キーでリレーションを持つテーブル同士であれば、クエリ発行回数を増やすことなく(1回で)データをとってくることができる