Django:QuerySetを使ってリレーション先のカラムにfilterし抽出する方法

Django:QuerySetを使ってリレーション先のカラムにfilterし抽出する方法

Django:QuerySetを使ってリレーション先のカラムにfilterし抽出する方法

Laravel のEloquentではコレがなかなか面倒だったりするけど、DjangoのQuerySetこの処理がとても簡単です。

__でテーブル名をつなぐだけでカラムまでたどり着ける

具体的にはこんなコードで処理できます。

リレーション先の値で抽出する具体例

具体的に今作っているスクリプトを例にします。

これは今私が作成しているポートフォリオPDFの生成システムのテーブルです。
案件=operationに対して、どんなスキルを使ったかをUseSkillというテーブルに記載していきます。

スキルの活用期間を算出したい場合どうすればいいか

UseSkillをスキルごとに抽出しスキルを利用した期間をoperationから計算しようとした場合、次のようなルートが考えられます。

  1. Skillをall()で全件取得、これをForループしUseSkillからOperation(案件)を抽出。さらに案件を回して自分の係わった案件の期間を計算し合計
  2. Operationから自分の係わった案件を抽出。これをForループしUseSkillを抽出。[スキル名,期間]のリストを作成しGroup_byで結合とSum
  3. UseSkillからリレーション先のOperationのuserに抽出条件をかけGroup_byし使用スキル名Listを作成。これをForループしOperationを抽出(enddate-startdate)の計算結果をSUMで集計
  4. UseSkillからリレーション先のOperationのuserに抽出条件をかけGroup_byし使用スキル名Listを作成。これをwhere in でOperationを抽出。pandasに入れてゴニョゴニョ
  5. UseSkillからリレーション先のOperationのuserに抽出条件をかけ抽出。結果をpandasに入れてゴニョゴニョ

泥臭く何回も『抽出=>Forループ』をかければ欲しい情報までは持っていけます。
でも勉強用なので3~5のどれかで行きたいです。
でこの時共通の課題となるのが【 リレーション先のテーブルのカラムに抽出条件をかける 】という操作です。

リレーション先の値で抽出するDjangoのスクリプト

1行で完了、しかもわかりやすい!Djangoスゲー。

これをLaravelのEloquentで書くとこんな感じ

functionが出てきたりなどなど慣れれば問題ないんですけど、敷居は高く見えますよね。

まとめ

QuerySetの一発で一気に日付計算までできないかなと試行錯誤しましたが、私にはまだ難易度高いようで挫折しました。

こんなで行けるかと思ったのですが、パラメーターに’operation’という文字列が入ってしまい失敗。
素直にPandasに格納しようと思いました。