0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

select_relatedについてまとめる

Last updated at Posted at 2023-09-15

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.

だそうです、、?日本語訳すると↓

クエリを実行する際に関連オブジェクトのデータを追加で選択し、外部キーのリレーションシップを "たどる "クエリセットを返します。これは、より複雑なクエリになりますが、後に外部キーリレーションシップを使用する際にデータベースクエリが不要になることを意味します。

んんー実際に見たほうが早いきがするので、コード見ていきましょう。

モデル定義
models.py
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回で)データをとってくることができる

0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?