IT未経験からの転職でORMで大苦戦した話
こんにちは!スリーケシステムの圓丘です!本日は、ORMで苦戦したことを記事にしていこうと思います。
前回のIT未経験から転職し、できるようになったことの記事の続きとなっているため興味のある方は見ていただけると幸いです😊
スリーケシステムに転職するまでは、製造業しかしておらず、ORM‥何それ‥みたいな感じでした(笑)
ORMとはsql(データベースを操作する言語)を書かなくても簡単にデータベースを操作するためのコードのことです。
前回の記事のような流れでとりあえずajaxとJqueryはある程度わかるようになり、datatableを扱うときの
Test_model.objects.filter(division='production').values('quantity')
などのような簡単なORMはすぐに理解することはできました。(リストの中に辞書型みたいなのは最初の方見るの嫌になりかけましたが(笑))
サンプルコードは簡単に説明するとTest_modelというテーブルのdivisionの列が'production'の行で絞り込み、絞り込んだ行の'quantity'の列の値を取得してくるという内容になります。
次に覚えたのが、select_relatedとprefetch_relatedという1対多のテーブル構造の値を取得してくるというものでした。
下の図のような感じです。
上の図では、複数の社員テーブルに対して1つの部署テーブルがあるイメージです。
1つの部署には複数の社員が所属しており、社員はそれぞれの情報を持っているイメージです。
select_relatedは特定の社員テーブル側から所属テーブルの情報を持ってくるという内容になります。
例えば、
社員テーブル.objects.select_related('部署テーブル').all()
とすると、それぞれの社員テーブルと一緒に部署テーブルのデータも持ってくることができます。
select_relatedは社員テーブルに対して決まった一つの部署テーブルがあるため、まだ理解しやすいのですが、prefetch_relatedでは部署側から所属している社員テーブルの情報を持ってくることになります。
部署テーブル1つに対して社員テーブルが複数になるので、なれていないとすごくイメージしづらく、自分んは思った通りに値を取得できずに結構苦戦しました😢
部署テーブル.社員テーブルには3つの社員テーブルが入っていて、そのままでは値を取得することができません。
なのでテーブルを一度変数に代入し、for文を回すことになります。
test_tables = 部署テーブル.prefetch_related('社員テーブル').all()
とした後に、
for data in test_table.社員テーブル:
print( data.部署名)
このようにするとfor文で3つあるdata.社員テーブルを順番にdataに代入して繰り返し処理し、その中でdata.部署名をprintすることで出力させています。
このprefetch_related周りがイメージできると以下のようなデータテーブルが作成できるようになったりします。
材料とその材料を使用している完成品番を表示しているテーブルになりますが、1つの材料に対してその材料を使用している品番が複数あるという内容の表になっています。
ORMは別途計算した列を追加したり、ORMの中で場合分できたりと色々できるのですが実際難しいのを実装しようとすると頭が痛くなってきます。
ORMは多分パズルとかが好きな人は好きかも?みたいな感じがします😊
結構色々できて楽しいので興味のある方はぜひ学習してみてください😆
半年間で実装したものを簡単に紹介している記事もありますのでぜひ読んでいただけたら幸いです!
最後までお読みいただきありがとうございました。