フィルタリングしたリレーションのデータを取得する
from django.db.models import Prefetch person_prefetch = Prefetch('person', queryset=Person.objects.filter(name='test')) company = Company.objects.prefetch_related(person_prefetch).get(pk=1) for person in company.person.all(): print(person.name)
Prefetchを使用すると、prefetch_relatedで取得するモデルに対してフィルタリングを行うことができます。
の形式で記入し、定義した変数をprefetch_related()の引数にすることでフィルタリングされたリレーションのデータのみを取得することができます。
Prefetchは第1引数は、リレーションのフィールド名、querysetは多側のモデルをどのようにするかを記入してください。
filterだけではなく、order_byで並べ替えたりexcludeで除外したりすることもできます。
上の例では、Companyモデルのpkが1のモデルに紐づいたPersonの中でnameフィールドがtestのデータだけを取得しています。
変数名 = Prefetch('リレーションのフィールド名', queryset=多側のモデルでのORM)
の形式で記入し、定義した変数をprefetch_related()の引数にすることでフィルタリングされたリレーションのデータのみを取得することができます。
Prefetchは第1引数は、リレーションのフィールド名、querysetは多側のモデルをどのようにするかを記入してください。
filterだけではなく、order_byで並べ替えたりexcludeで除外したりすることもできます。
上の例では、Companyモデルのpkが1のモデルに紐づいたPersonの中でnameフィールドがtestのデータだけを取得しています。