これら二つはあなたがさらにプリフェッチ動作を制御するためのプリフェッチオブジェクトを使用することができ、同じ
MyClass.objects.prefetch_related('relation')
MyClass.objects.prefetch_related(
Prefetch('relation', to_attr='relation_as_list')
)
ある(docs)
あなたが必要な場合にのみ、Prefetch
オブジェクトが必要ですprefetch_related
の結果を絞り込みます。たとえば、relation
のすべてを必要とせず、プリフェッチクエリを絞り込むことができます。 to_attrを使用
それが関連するマネージャのキャッシュにフィルタリングされた結果を格納する未満あいまいであるとしてプリフェッチ結果をダウンフィルタリングするときには、
to_attr
追加の性能ブーストを与えない(docs)が推奨されます関係をあいまいにすることなく、同じQuerySetsとの関係をプリフェッチすることができます。
MyClass.objects.prefetch_related(
Prefetch('same_relation', queryset=queryset_one, to_attr='relation_set_one')
Prefetch('same_relation', queryset=queryset_two, to_attr='relation_set_two')
)
あなたが異なるPrefetch
オブジェクトと同じ関係をプリフェッチした場合
は、それらのそれぞれのための追加のクエリがあるでしょう。結果のプリフェッチQuerySetsはリストに格納されますが、結果はあなたが
relation_as_list
と仮定したようなリストではありません。それらはQuerySetsです。あなたの例では、双方の関係にアクセスすることは
prefetch_related
が1(追加)DBヒットに関連するオブジェクトを取得し、要約するとパフォーマンスが向上
についてmy_obj.relation_as_list.all()
とmy_obj.relation.all()
のように、all()
で行うことができますパフォーマンスが向上します。 Prefetch
オブジェクトを使用すると、このDBコールをさらに細かく調整できます。
for item in yourmodel.object.all():
for a_relation in item.relation.all():
do_something(a_relation)
# WITHOUT PREFETCH RELATED YOU'D HIT DB EVERY TIME!!
# IMAGINE IF YOU HAD TONS OF ITEMS
# THIS WILL HAVE 2 DB HITS
for item in yourmodel.object.prefetch_related('relation').all().:
for a_relation in item.relation.all():
do_something(a_relation)