2017-08-11 5 views
0

のは、私がCityWorkplace Sを照会しましょうと多対多の関係ですべてのWorker秒、プリフェッチ:私はWorkplace SのいずれかからWorker S上の任意のQuerySet操作を使用している場合プリフェッチされたリレーションシップのQuerySet操作はデータベースにヒットしますか?

workplaces = list(city.workerplace_set.filter(num_employees__lte=350).prefetch_related('Worker')) 

を、データベースがヒットするかどうか?私はドキュメントから明確な答えを出すことができませんでした。

workplaces_with_interns = [workplace for workplace in workplaces 
          # is this filter going to query the database? 
          if workplace.worker_set.filter(salary=0).exists()] 

PS:誰かが、おそらく私は単に代わりにlist作るのcity.workerplace_setのクエリを行うことにより、同じ答えに達することができることを指摘しようとしています。はい、私は知っていますが、私はworkplacesをキャッシングしているので、これはできません。これは、このすべてを行う関数が呼び出されるたびにデータベースがヒットしないようにするためです。

答えて

0

はい。これは、元のプリフェッチに存在しない特定のクエリ(フィルタ上に存在する)を実行しているため、データベースにヒットします。あなたのケースでは

、すでに労働者を持っているので、Pythonでそれらをフィルタリングする方が良いでしょう:

また
[workplace for workplace in workplaces 
if any(w.salary == 0 for w in workplace.worker_set.all())] 

、これはあなたがプリフェッチを必要とする唯一の理由である場合、あなたはプリフェッチを使用することができます元のクエリのオブジェクトで、給与が0の労働者のみを取得します。

(Prefetchオブジェクトを持たない1.4を使用していることに気がつきました。その理由だけでなく、主に1.4が古くてサポートされていないため、確かにセキュリティ上のリスクがあります)

+0

したがって、 'workplace.worker_set.all()'以外のクエリはDBにヒットしますか? – dabadaba

関連する問題