SlideShare a Scribd company logo
1 of 52
Takayuki Shimizukawa
Django ORM道場
クエリの基本を押さえ
より良い形を身に付けよう
1
PyCon APAC 2023
● Philippines / Manila 在住
● Pythonプログラマー (2004~ 19年目
● Pythonコミュニティー運営
○ Python mini Hack-a-thon; 2009年~
○ Sphinx users JP; 2010年~
○ PyCon JP Association; accounting director
● (株) BePROUD; IT Architect
● Books 翻訳/執筆 (13冊)
about.me/shimizukawa
2
(CM)『Sphinxをはじめよう 第3版』
3
PythonドキュメンテーションといえばSphinx。
本書はSphinxで執筆し、re:VIew ビルダーで出力し、
組版までワンソースで出版まで行いました。
サイン会もやらせて
ていただきました
m(_ _)m
本日20F O'reillyさんでお安く購入できます!
アジェンダ
● このDjango ORM、どんなSQLを実行しているの?
● 一の形:実行しているSQLをいつも確認する
● 二の形:意図しないタイミングでのSQL発行を避ける
● 三の形:理想のSQLからORMを組む
● 質疑応答
4
デモコード
https://github.com/shimizukawa/pycon-apac-2023-django-orm-dojo
このDJango ORM、
どんなSQLを実行しているの?
5
6
それでは問題です
(実際の現場であったコードの簡易版です)
Q1. どんなSQLを実行してる?
7
レビュー時の
差分はここ
モデル定義
Q1. どんなSQLを実行してる?
8
モデル定義
Q1. どんなSQLを実行してる?
9
index.html
い. SELECT * FROM staff ORDER BY last_login
Q1. どんなSQLを実行してる?
10
い. SELECT * FROM staff ORDER BY last_login
ろ. SELECT pk, name FROM staff ORDER BY last_login
Q1. どんなSQLを実行してる?
11
Q1. どんなSQLを実行してる?
12
い. SELECT * FROM staff ORDER BY last_login
ろ. SELECT pk, name FROM staff ORDER BY last_login
は. 分からん
Q1. どんなSQLを実行してる?
13
い. SELECT * FROM staff ORDER BY last_login
ろ. SELECT pk, name FROM staff ORDER BY last_login
は. 分からん
Q1. どんなSQLを実行してる?
14
は. 分からん。実際に観察してみましょう。
DEMO
注目したのはここ
デモコード
https://github.com/shimizukawa/pycon-apac-2023-django-orm-dojo
Q1. どんなSQLを実行してる?
15
は. 分からん。実際に観察してみましょう。
SQLはQuerySetの使い方によって変わります。
注目したのはここ
「only?大丈夫かな?」と思ったあなたは、...
ORM師範になれるかも💪
「い」「ろ」を選んだあなたは、....
Django ORM道場へようこそ!
みなさんの選択は?
16
Django ORM道場へようこそ
● Django ORMは便利なやつですが、...
○ 時々、とても効率の悪いSQLを実行しているかも
○ 先ほどの例は、N+1と呼ばれるヤツです
● 経験や勘に頼らず、
処理を効率良く行うことができるよう、
道場で、基本の形から見なおしていきましょう。
17
3つの基本形
● 1つ、実行しているSQLをいつも確認しよう
● 1つ、意図しないタイミングでのSQL発行を避けよう
● 1つ、理想のSQLからORMを組もう
18
(CM) BeProud メンバー募集中!
19
Pythonプログラマー、他、ソフトウェア開発やっていくぞ!という
メンバーを通年募集中です!
今すぐBeProud ブースへ!!
自社サービス 書籍執筆 受託開発
一の形:実行しているSQLを
いつも確認しよう
20
実行しているSQLをいつも確認
21
DjangoでSQL実行ログを確
認するには、settings.py に
数行追加しましょう。
(日時もログ出力するにはもうちょ
っと色々設定してください)
では、コンソールログを確
認してみましょう。
ここを追加
実行しているSQLをいつも確認
22
1. 画面アクセスでSQLが表示される
2. migrationでもSQLが表示される
3. N+1の原因コードを修正
DEMO
デモコード
https://github.com/shimizukawa/pycon-apac-2023-django-orm-dojo
実行しているSQLをいつも確認
23
1. 画面アクセスでSQLが表示されました
2. migrationでもSQLが表示されました
3. N+1の原因コード修正が確認できました
補足: only も使い方次第
● DBとの通信を減らすには only が有効
○ 巨大なデータを持つカラムが参照不要と分かっている場合
○ 数万件を取得して、特定カラムだけ参照する場合
● QuerySetの使い方次第では逆効果に...
○ onlyに指定したカラムだけにアクセスする限り、問題なし
○ 指定外のカラムにアクセスすると、都度SQL発行が発動
24
ログは現状を映す鏡
● ログを見よう
○ スポーツ選手が鏡や動画で動きをチェックするように
○ ログ出力は、プログラミングにおける鏡
● SQLを常に観察する習慣を身に付けよう
○ QuerySetに手を加えるとき
○ QuerySetを使った処理を変更するとき
○ レビューに出すとき、SQL出力を添えると👍
○ レビューを受け取ったとき、SQLも確認すると👍
25
ログ以外でSQL確認
26
1. django-debug-toolbar
○ 👍Web画面にデバッグツールバーが
追加され、そこでSQL情報を確認
○ 👎Web画面がないと使えない
■ 最近はDjangoで画面を表示せずAPIサーバーのみの場合も増えており...
2. django-silk
○ 👍SQL実行を専用画面で俯瞰して確認
○ 👎DB保存するので本番利用は避けて!
[CM] 『自走プログラマー』
『自走プログラマー』は120のベストプラクティス
をPythonの先輩から学び、プログラミング中級者を
目指すための書籍です。
Django ORMの話題を含む、コードレビューや技術指導など
で伝えたい事例を多数紹介しています。
Web抜粋版の引用やリンクはご自由にどうぞ!
今すぐ 自走プログラマー で検索!
27
二の形:意図しないタイミング
でのSQL発行を避けよう
28
29
それでは問題 Q2 です
(実際の現場であった事例を元にした創作です)
Q2. 意図しないSQL発行を防止するには?
30
qs = SomeModel.objects.filter(...) の後どうする?
Q2. 意図しないSQL発行を防止するには?
31
qs = SomeModel.objects.filter(...) の後どうする?
QuerySetをテンプレートに渡したらN+1
が発生したのが問題でした
Q2. 意図しないSQL発行を防止するには?
32
qs = SomeModel.objects.filter(...) の後どうする?
QuerySetをテンプレートに渡したらN+1
が発生したのが問題でした
それなら、QuerySetをテンプレートに渡
さなければ問題にならないのでは?
Q2. 意図しないSQL発行を防止するには?
33
qs = SomeModel.objects.filter(...) の後どうする?
い. list(qs)でSQL発行を確定し、データクラスに詰め替え
それなら、QuerySetをテンプレートに渡
さなければ問題にならないのでは?
Q2. 意図しないSQL発行を防止するには?
34
qs = SomeModel.objects.filter(...) の後どうする?
い. list(qs)でSQL発行を確定し、データクラスに詰め替え
ろ. list(qs.values(...))でSQL発行を確定し、辞書化
それなら、QuerySetをテンプレートに渡
さなければ問題にならないのでは?
Q2. 意図しないSQL発行を防止するには?
35
qs = SomeModel.objects.filter(...) の後どうする?
い. list(qs)でSQL発行を確定し、データクラスに詰め替え
ろ. list(qs.values(...))でSQL発行を確定し、辞書化
は. qsをやめてpandas.read_sql()してDataFrame上で処理
それなら、QuerySetをテンプレートに渡
さなければ問題にならないのでは?
Q2. 意図しないSQL発行を防止するには?
36
qs = SomeModel.objects.filter(...) の後どうする?
い. list(qs)でSQL発行を確定し、データクラスに詰め替え
ろ. list(qs.values(...))でSQL発行を確定し、辞書化
は. qsをやめてpandas.read_sql()してDataFrame上で処理
に. 場合による
Q2. 意図しないSQL発行を防止するには?
37
qs = SomeModel.objects.filter(...) の後どうする?
い. list(qs)でSQL発行を確定し、データクラスに詰め替え
ろ. list(qs.values(...))でSQL発行を確定し、辞書化
は. qsをやめてpandas.read_sql()してDataFrame上で処理
に. 場合による
Q2. 意図しないSQL発行を防止するには?
38
に. 場合による。QuerySetの便利さを捨てる場合、デメリットも。
● い. list(qs)でSQL発行を確定し、データクラスに詰め替え
○ 👍クラス定義によってデータの目的が明確になり、扱いやすい
○ 👎詰め替えの実装はけっこう手間がかかる
■ 期待通り詰め替えられているかのUTも書かないといけないよね?
● ろ. list(qs.values(...))でSQL発行を確定し、辞書化
○ 👍取り出した時点で辞書になっているので、データ詰め替えが不要
○ 👎QuerySetを活用するDRF Serializer等とは相性が悪い
● は. qsをやめてpandas.read_sql()してDataFrame上で処理
○ 👍SQL発行が確定するのは間違いなさそう
○ 👎Pandasを持ち出す必要があったのかはよく考えよう
[事例]データクラスに詰め替え
あるプロジェクトでは、
● データクラスに詰め替える実装に変更
○ データ取得、加工、詰め替え、利用でレイヤー増加
■ 実装コード、テストコードの増加(開発時間の増加)
■ コードの見通しが悪化(レイヤーが増えただけ)
■ 付け焼刃の対策が増加(レイヤー間の変数引き回し)
■ データクラスが目的のないバケツ化(dictと変わらない)
● この状態で、ORMクエリの変更をレビューしました(´・ω・`)
39
40
ムダに複雑なコードは問題です
どのような対策が考えられるでしょう?
複雑な問題は複雑なまま解かない
● 課題: コードが複雑で変更が適切か分からない
○ 対策: コードをシンプルにしてから考える
● 課題: 複数レイヤーに分散して見通しが悪い
○ 対策: 考えるために、一旦コードを1ファイルへ集約
● 課題: データ詰め替えが手間
○ 対策: 省略できる処理をばっさり削除(開発ルールやフレームワークの都合は一旦無視)
● 課題: データクラスがバケツ化
○ 対策: データクラス廃止を検討
● 課題: 付け焼き刃の対策コードが多い
○ 対策: シンプルなコードで対策を考える
41
Q1のコードを例に説明
views.py
index.html
42
try1.py
Q1のコードを1ファイルに集約
43
1ファイルに集約して試行錯誤
44
DEMO
1.try1.py にコードを集約
2.python try1.py
3. ログを確認しながら試行錯誤
デモコード
https://github.com/shimizukawa/pycon-apac-2023-django-orm-dojo
ここを変更
try1.py
1ファイル上で試行錯誤した結果
45
試行錯誤のループ
● while 欲しいORMクエリが書けたか:
○ コード上に分散したORMクエリを修正
○ QuerySetの利用箇所を修正
○ その処理を呼び出すWeb画面を操作
○ DjDTやSlikを確認するため、画面を操作
コードが分散しているし、画面操作が多くて面倒....
1ファイルに集約して、コマンド実行でサクサク確認しよう
46
datamodels.py
views.py
serializers.py
index.html
試行錯誤の高速化
● while 欲しいORMクエリが書けたか:
○ 1つの .py ファイルを修正
○ .py ファイルを実行して、ログを確認
1ファイルに集約するメリット
● コードが1箇所で把握しやすい
● 画面操作が不要
● 適切なモジュールへの配置や整形に気にせず書ける
47
try1.py
try1.py
意図しないSQL発行を防止するには
48
1. コードの全体像を把握して、
2. ORMクエリの準備、データ加工、利用の処理から、
3. 必要十分なSQLが発行されるように全体を調整し、
4. 最も効率の良いコードにまとめる
この作業を、シンプルなコードで高速に回しましょう
models.py
datamodels.py
serializers.py
views.py
index.html
try1.py
models.py serializers.py
views.py index.html
三の形:理想のSQLから
ORMを組もう
49
三の形:理想のSQLから
ORMを組もう
50
続きは 書籍で!
ありがとうございました
Questions?
51
https://about.me/shimizukawa
Welcome to
Sprint after-party of
Register now!! →
Let’s have fun
at the end of
2023-10-29T18:30:00+09:00
Venue: Shibuya
Fee: >6,000 JPY
(discount for students)
(CM) 10/29(Sun) 18:30~ 非公式Party

More Related Content

What's hot

トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化Kumazaki Hiroki
 
継続使用と新規追加したRedmine Plugin
継続使用と新規追加したRedmine Plugin継続使用と新規追加したRedmine Plugin
継続使用と新規追加したRedmine PluginMei Nakamura
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説貴仁 大和屋
 
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則現場で役立つシステム設計の原則
現場で役立つシステム設計の原則増田 亨
 
オトナのTDD(テスト駆動開発)入門
オトナのTDD(テスト駆動開発)入門オトナのTDD(テスト駆動開発)入門
オトナのTDD(テスト駆動開発)入門Yoshinori Yamanouchi
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかShogo Wakayama
 
うちのRedmineの使い方
うちのRedmineの使い方うちのRedmineの使い方
うちのRedmineの使い方Tomohisa Kusukawa
 
挫折しないRedmine (2022)
 挫折しないRedmine  (2022) 挫折しないRedmine  (2022)
挫折しないRedmine (2022)Go Maeda
 
「プロジェクト管理」を超えた Redmine 活用の道のりとこれから
「プロジェクト管理」を超えた Redmine 活用の道のりとこれから「プロジェクト管理」を超えた Redmine 活用の道のりとこれから
「プロジェクト管理」を超えた Redmine 活用の道のりとこれからMinoru Maeda
 
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜aha_oretama
 
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』Yoshitaka Kawashima
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugItsuki Kuroda
 
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)Koichiro Matsuoka
 
プラクティス厨から始めるアジャイル開発
プラクティス厨から始めるアジャイル開発プラクティス厨から始めるアジャイル開発
プラクティス厨から始めるアジャイル開発Arata Fujimura
 
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話Yoshitaka Kawashima
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
BIGLOBE RDRA導入後の要件定義の変化
BIGLOBE RDRA導入後の要件定義の変化BIGLOBE RDRA導入後の要件定義の変化
BIGLOBE RDRA導入後の要件定義の変化BIGLOBE Inc.
 
Spring 歴約1年初心者の Test 奮闘記
Spring 歴約1年初心者の Test 奮闘記Spring 歴約1年初心者の Test 奮闘記
Spring 歴約1年初心者の Test 奮闘記chishizu naito
 

What's hot (20)

トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化
 
継続使用と新規追加したRedmine Plugin
継続使用と新規追加したRedmine Plugin継続使用と新規追加したRedmine Plugin
継続使用と新規追加したRedmine Plugin
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説
 
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則現場で役立つシステム設計の原則
現場で役立つシステム設計の原則
 
オトナのTDD(テスト駆動開発)入門
オトナのTDD(テスト駆動開発)入門オトナのTDD(テスト駆動開発)入門
オトナのTDD(テスト駆動開発)入門
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
女の子になれなかった人のために
女の子になれなかった人のために女の子になれなかった人のために
女の子になれなかった人のために
 
うちのRedmineの使い方
うちのRedmineの使い方うちのRedmineの使い方
うちのRedmineの使い方
 
挫折しないRedmine (2022)
 挫折しないRedmine  (2022) 挫折しないRedmine  (2022)
挫折しないRedmine (2022)
 
「プロジェクト管理」を超えた Redmine 活用の道のりとこれから
「プロジェクト管理」を超えた Redmine 活用の道のりとこれから「プロジェクト管理」を超えた Redmine 活用の道のりとこれから
「プロジェクト管理」を超えた Redmine 活用の道のりとこれから
 
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
 
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
 
プラクティス厨から始めるアジャイル開発
プラクティス厨から始めるアジャイル開発プラクティス厨から始めるアジャイル開発
プラクティス厨から始めるアジャイル開発
 
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
BIGLOBE RDRA導入後の要件定義の変化
BIGLOBE RDRA導入後の要件定義の変化BIGLOBE RDRA導入後の要件定義の変化
BIGLOBE RDRA導入後の要件定義の変化
 
Spring 歴約1年初心者の Test 奮闘記
Spring 歴約1年初心者の Test 奮闘記Spring 歴約1年初心者の Test 奮闘記
Spring 歴約1年初心者の Test 奮闘記
 

Similar to Django ORM道場:クエリの基本を押さえ,より良い形を身に付けよう

Nodeにしましょう
NodeにしましょうNodeにしましょう
NodeにしましょうYuzo Hebishima
 
ユーザ・デザイナーから見たPlone CMSのアピールポイント
ユーザ・デザイナーから見たPlone CMSのアピールポイントユーザ・デザイナーから見たPlone CMSのアピールポイント
ユーザ・デザイナーから見たPlone CMSのアピールポイントMasaki NIWA
 
Django で始める PyCharm 入門
Django で始める PyCharm 入門Django で始める PyCharm 入門
Django で始める PyCharm 入門kashew_nuts
 
Windowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようWindowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようKenji NAKAGAKI
 
2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについてMasahito Zembutsu
 
オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。
オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。
オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。Akihiro Kuwano
 
いままでのJaSSTnanoLT動画を振り返る&おススメしたいの! / Looking back and recommend on the JaSSTna...
いままでのJaSSTnanoLT動画を振り返る&おススメしたいの! / Looking back and recommend on the JaSSTna...いままでのJaSSTnanoLT動画を振り返る&おススメしたいの! / Looking back and recommend on the JaSSTna...
いままでのJaSSTnanoLT動画を振り返る&おススメしたいの! / Looking back and recommend on the JaSSTna...ICO
 
Pythonで検索エンジン2
Pythonで検索エンジン2Pythonで検索エンジン2
Pythonで検索エンジン2Yasukazu Kawasaki
 
20120915 Pythonは本当にBlenderの役に立っているか?
20120915 Pythonは本当にBlenderの役に立っているか?20120915 Pythonは本当にBlenderの役に立っているか?
20120915 Pythonは本当にBlenderの役に立っているか?Tetsuo Mitsuda
 
20101127 Android Usability Seminar
20101127 Android Usability Seminar20101127 Android Usability Seminar
20101127 Android Usability SeminarVisso株式会社
 
初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウKentarou Mukunasi
 
Platform io で シュッと arduino 開発を高速化しよう speed up your arduino development with p...
Platform io で シュッと arduino 開発を高速化しよう speed up your arduino development with p...Platform io で シュッと arduino 開発を高速化しよう speed up your arduino development with p...
Platform io で シュッと arduino 開発を高速化しよう speed up your arduino development with p...74th
 
APIドキュメントの話 #sphinxjp
APIドキュメントの話 #sphinxjpAPIドキュメントの話 #sphinxjp
APIドキュメントの話 #sphinxjpTakeshi Komiya
 
アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱Koichi ITO
 
Boost.勉強会 #13 @仙台 鳥小屋
Boost.勉強会 #13 @仙台 鳥小屋Boost.勉強会 #13 @仙台 鳥小屋
Boost.勉強会 #13 @仙台 鳥小屋Yuto M
 
Python & PyConJP 2014 Report
Python & PyConJP 2014 ReportPython & PyConJP 2014 Report
Python & PyConJP 2014 Reportgree_tech
 
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜Yuji Nojima
 

Similar to Django ORM道場:クエリの基本を押さえ,より良い形を身に付けよう (20)

Nodeにしましょう
NodeにしましょうNodeにしましょう
Nodeにしましょう
 
ユーザ・デザイナーから見たPlone CMSのアピールポイント
ユーザ・デザイナーから見たPlone CMSのアピールポイントユーザ・デザイナーから見たPlone CMSのアピールポイント
ユーザ・デザイナーから見たPlone CMSのアピールポイント
 
Django で始める PyCharm 入門
Django で始める PyCharm 入門Django で始める PyCharm 入門
Django で始める PyCharm 入門
 
210630 python
210630 python210630 python
210630 python
 
Windowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようWindowsにpythonをインストールしてみよう
Windowsにpythonをインストールしてみよう
 
2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて
 
オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。
オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。
オンプレエンジニアがクラウドエンジニアを夢見て。じっと手を見る。
 
いままでのJaSSTnanoLT動画を振り返る&おススメしたいの! / Looking back and recommend on the JaSSTna...
いままでのJaSSTnanoLT動画を振り返る&おススメしたいの! / Looking back and recommend on the JaSSTna...いままでのJaSSTnanoLT動画を振り返る&おススメしたいの! / Looking back and recommend on the JaSSTna...
いままでのJaSSTnanoLT動画を振り返る&おススメしたいの! / Looking back and recommend on the JaSSTna...
 
Logcatの話
Logcatの話Logcatの話
Logcatの話
 
Pythonで検索エンジン2
Pythonで検索エンジン2Pythonで検索エンジン2
Pythonで検索エンジン2
 
20120915 Pythonは本当にBlenderの役に立っているか?
20120915 Pythonは本当にBlenderの役に立っているか?20120915 Pythonは本当にBlenderの役に立っているか?
20120915 Pythonは本当にBlenderの役に立っているか?
 
20101127 Android Usability Seminar
20101127 Android Usability Seminar20101127 Android Usability Seminar
20101127 Android Usability Seminar
 
初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ初心者向けAndroidゲーム開発ノウハウ
初心者向けAndroidゲーム開発ノウハウ
 
Platform io で シュッと arduino 開発を高速化しよう speed up your arduino development with p...
Platform io で シュッと arduino 開発を高速化しよう speed up your arduino development with p...Platform io で シュッと arduino 開発を高速化しよう speed up your arduino development with p...
Platform io で シュッと arduino 開発を高速化しよう speed up your arduino development with p...
 
APIドキュメントの話 #sphinxjp
APIドキュメントの話 #sphinxjpAPIドキュメントの話 #sphinxjp
APIドキュメントの話 #sphinxjp
 
SnapDishの事例
SnapDishの事例SnapDishの事例
SnapDishの事例
 
アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱アジャイルソフトウェア開発の道具箱
アジャイルソフトウェア開発の道具箱
 
Boost.勉強会 #13 @仙台 鳥小屋
Boost.勉強会 #13 @仙台 鳥小屋Boost.勉強会 #13 @仙台 鳥小屋
Boost.勉強会 #13 @仙台 鳥小屋
 
Python & PyConJP 2014 Report
Python & PyConJP 2014 ReportPython & PyConJP 2014 Report
Python & PyConJP 2014 Report
 
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
エンジニアの為のWordPress入門 〜WordPressはWebAppプラットフォームです〜
 

More from Takayuki Shimizukawa

Navigating Python: Milestones from Essential Reads
Navigating Python: Milestones from Essential ReadsNavigating Python: Milestones from Essential Reads
Navigating Python: Milestones from Essential ReadsTakayuki Shimizukawa
 
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022Takayuki Shimizukawa
 
プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022
プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022
プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022Takayuki Shimizukawa
 
『自走プログラマー』 が我々に必要だった理由
『自走プログラマー』 が我々に必要だった理由『自走プログラマー』 が我々に必要だった理由
『自走プログラマー』 が我々に必要だった理由Takayuki Shimizukawa
 
エキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころエキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころTakayuki Shimizukawa
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoTakayuki Shimizukawa
 
独学プログラマーのその後
独学プログラマーのその後独学プログラマーのその後
独学プログラマーのその後Takayuki Shimizukawa
 
Sphinx customization for OGP support at SphinxCon JP 2018
Sphinx customization for OGP support at SphinxCon JP 2018Sphinx customization for OGP support at SphinxCon JP 2018
Sphinx customization for OGP support at SphinxCon JP 2018Takayuki Shimizukawa
 
Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?Takayuki Shimizukawa
 
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016Takayuki Shimizukawa
 
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016Takayuki Shimizukawa
 
素振りのススメ at Python入門者の集い
素振りのススメ at Python入門者の集い素振りのススメ at Python入門者の集い
素振りのススメ at Python入門者の集いTakayuki Shimizukawa
 
世界のSphinx事情 @ SphinxCon JP 2015
世界のSphinx事情 @ SphinxCon JP 2015世界のSphinx事情 @ SphinxCon JP 2015
世界のSphinx事情 @ SphinxCon JP 2015Takayuki Shimizukawa
 
JUS関西 Sphinxワークショップ@関西 Sphinx紹介
JUS関西 Sphinxワークショップ@関西 Sphinx紹介JUS関西 Sphinxワークショップ@関西 Sphinx紹介
JUS関西 Sphinxワークショップ@関西 Sphinx紹介Takayuki Shimizukawa
 
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
Sphinxで作る貢献しやすいドキュメント翻訳の仕組みSphinxで作る貢献しやすいドキュメント翻訳の仕組み
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組みTakayuki Shimizukawa
 
Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015Takayuki Shimizukawa
 
Easy contributable internationalization process with Sphinx @ pyconmy2015
Easy contributable internationalization process with Sphinx @ pyconmy2015Easy contributable internationalization process with Sphinx @ pyconmy2015
Easy contributable internationalization process with Sphinx @ pyconmy2015Takayuki Shimizukawa
 
Sphinx autodoc - automated api documentation - PyCon.MY 2015
Sphinx autodoc - automated api documentation - PyCon.MY 2015Sphinx autodoc - automated api documentation - PyCon.MY 2015
Sphinx autodoc - automated api documentation - PyCon.MY 2015Takayuki Shimizukawa
 
Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)
Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)
Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)Takayuki Shimizukawa
 

More from Takayuki Shimizukawa (20)

Navigating Python: Milestones from Essential Reads
Navigating Python: Milestones from Essential ReadsNavigating Python: Milestones from Essential Reads
Navigating Python: Milestones from Essential Reads
 
IKEv2-VPN PyHackCon2023
IKEv2-VPN PyHackCon2023IKEv2-VPN PyHackCon2023
IKEv2-VPN PyHackCon2023
 
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022
 
プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022
プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022
プログラマーとの出会い - Hello, Programmer! at PyCon Kyushu 2022
 
『自走プログラマー』 が我々に必要だった理由
『自走プログラマー』 が我々に必要だった理由『自走プログラマー』 が我々に必要だった理由
『自走プログラマー』 が我々に必要だった理由
 
エキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころエキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころ
 
RLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for DjangoRLSを用いたマルチテナント実装 for Django
RLSを用いたマルチテナント実装 for Django
 
独学プログラマーのその後
独学プログラマーのその後独学プログラマーのその後
独学プログラマーのその後
 
Sphinx customization for OGP support at SphinxCon JP 2018
Sphinx customization for OGP support at SphinxCon JP 2018Sphinx customization for OGP support at SphinxCon JP 2018
Sphinx customization for OGP support at SphinxCon JP 2018
 
Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?
 
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016仕事で使うちょっとしたコードをOSSとして開発メンテしていく- Django Redshift Backend の開発 - PyCon JP 2016
仕事で使うちょっとしたコードをOSSとして開発メンテしていく - Django Redshift Backend の開発 - PyCon JP 2016
 
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
Easy contributable internationalization process with Sphinx @ PyCon APAC 2016
 
素振りのススメ at Python入門者の集い
素振りのススメ at Python入門者の集い素振りのススメ at Python入門者の集い
素振りのススメ at Python入門者の集い
 
世界のSphinx事情 @ SphinxCon JP 2015
世界のSphinx事情 @ SphinxCon JP 2015世界のSphinx事情 @ SphinxCon JP 2015
世界のSphinx事情 @ SphinxCon JP 2015
 
JUS関西 Sphinxワークショップ@関西 Sphinx紹介
JUS関西 Sphinxワークショップ@関西 Sphinx紹介JUS関西 Sphinxワークショップ@関西 Sphinx紹介
JUS関西 Sphinxワークショップ@関西 Sphinx紹介
 
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
Sphinxで作る貢献しやすいドキュメント翻訳の仕組みSphinxで作る貢献しやすいドキュメント翻訳の仕組み
Sphinxで作る貢献しやすい ドキュメント翻訳の仕組み
 
Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015Sphinx autodoc - automated api documentation - PyCon.KR 2015
Sphinx autodoc - automated api documentation - PyCon.KR 2015
 
Easy contributable internationalization process with Sphinx @ pyconmy2015
Easy contributable internationalization process with Sphinx @ pyconmy2015Easy contributable internationalization process with Sphinx @ pyconmy2015
Easy contributable internationalization process with Sphinx @ pyconmy2015
 
Sphinx autodoc - automated api documentation - PyCon.MY 2015
Sphinx autodoc - automated api documentation - PyCon.MY 2015Sphinx autodoc - automated api documentation - PyCon.MY 2015
Sphinx autodoc - automated api documentation - PyCon.MY 2015
 
Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)
Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)
Sphinx autodoc - automated API documentation (EuroPython 2015 in Bilbao)
 

Recently uploaded

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 

Recently uploaded (8)

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 

Django ORM道場:クエリの基本を押さえ,より良い形を身に付けよう

Editor's Notes

  1. I have been using Python since 2004 My main activities are as follows: Organizing Python communities in Japan: "Python mini Hack-a-thon", "Sphinx users JP" and "PyCon JP Association" non-profit organization. Working as an IT architect at BePROUD Inc in Japan. I also translate and write Python related books. For more information, please visit https://about.me/shimizukawa
  2. ある日レビュー依頼がきました。 差分は問題なさそうですが、ふと、差分とは関係ない別のことが気になりました。
  3. 差分のひとつにクエリのorder_by条件の変更があり、それ自体は問題無さそうです。 ここで私が気になったのは、このクエリがどういうSQLを実行しているか、です。 このクエリ、どんなSQLを実行していると思いますか?
  4. ちなみに、モデル定義はこんな感じ
  5. ちなみに、テンプレートはこんな感じです。
  6. 注目したのは、onlyの部分です。
  7. DB保存すると、トランザクションが競合してロールバックしちゃったり、DB容量を圧迫したり、パフォーマンスに影響を与えたりします。
  8. 弊社ビープラウドブースにて、見本を読めますので、ブースにもお立ち寄りください~
  9. 先ほどの例ではORMクエリをテンプレートに渡したことで、N+1が発生したので、代わりにデータクラスに詰め替える実装にしました。しかし今度はソースコードが複雑になって開発しづらくなってしまいました。 ビューの処理内にSQL発行を閉じ込めることで意図しないタイミングでのSQL発行を避ける方針は良いですが、実装の手間が増えてしまうのも考え物です。
  10. Djangoテンプレートのforループ処理やフィルター処理などに利用箇所が分散していることがあります。 また、クラスベースビューではベースとなるquerysetの用意とそこにクエリ条件を追加する処理が分かれていたり、Django REST Frameworkではさらにシリアライザの都合に合わせてselect_relatedやprefetch_relatedの用意が必要になったりします。
  11. Expert Python Programming, Fourth Edition's Target Audience are: Python developers who want to master Python in depth Python developers who use Python in their work Overview: This book covers the tools, techniques, and best practices that advanced Python programmers use in their work. Readers will learn advanced Python concepts and skills to create more efficient and high-quality Python code.
  12. Translation and writing works Since the first book in 2010, I have continued to translate and write as a side job while working on Python web applications. This year, my 13th book was published. Today I would like to share with you four books that mark milestones in my experience as a author and a translator. They are entitled, "Python books as milestones"