リレーションされているモデルのデータを取得する(多側から1側)
model = Person.objects.select_related('company').all().values('company__name')
多側のモデル.objects.select_related('1側のモデルのrelated_name').get(条件)やfilter(条件)やall()など.values('1側のモデルのrelated_name__1側のフィールド名')
とすることで多側からの紐づいた1側のモデルのデータを取得することができます。
本来、値取得のたびに取得するモデルのsqlの発行がされるのですが、select_relatedを使用すると、多側のモデル取得時に1側のモデルのデータも同時に取得するため、複数回sqlが発行されることを防ぐことができます。
次に紹介するprefetch_relatedも同じような理由で使用されます。
これらは、for文でデータを繰り返し処理するときなどに顕著に表れます。
このように必要以上にsqlが発行されパフォーマンスが悪くなる問題をN+1問題といいます。
多対1の関係というのは、
会社(1)に対して人(多)が存在するという関係のことを言います。
なので、人側から見ると会社は1個に特定されるので、紐づいたモデルは1つとなる関係です。
上の例では、Personモデルと紐づいたCompanyモデルのnameフィールドの値を取得しています。
また、1件のみデータを取得したいときなどは
Person.objects.select_related('company').all()
test[0].company.name
test[0].company.name
このような形式でも紐づいているモデルにアクセスすることができます。