この記事は、Django Advent Calendar 2016 15日目の記事です。
djangoを本格的に初めて半年近く立ちますが、Djangoにはまとまった本や資料がないので困ったときはグーグル先生頼みになってしまうと思います。
とはいえコピペで乗り切っていくのも限界はすぐに来ます。
なので、初心者が知っておくべき考え方や理屈をちょっとまとめようかなと思います。
##フォルダ構成について
Djangoでプロジェクト立ち上げるとなんちゃら.pyがおおすぎてパニック起こすので整理しようと思います。
まずはプロジェクトを作ります
django-admin startproject shatiku
manage.py
shatiku/
__init__.py
settings.py ・・・DBの接続情報とかが書かれてる
urls.py ・・・アプリケーションの情報がかかれる
wsgi.py ・・・気にしない
ここではsettings.pyとurls.pyだけ見ます、一旦他は気にしなくて良いです。
####urls.pyに書くこと
ttp://damedeah.com/[この部分]/
この後アプリケーションを作りますが、その時には[この部分]を作ります。
が、[この部分]をプロジェクト名/プロジェクト名/urls.pyに書いてあげないとDjangoはそんなの知らんと無視してします。
###アプリケーションを作ろう!
次に[この部分]に相当するアプリケーションを作ります。
python manage.py startapp scream
ttp://damedeah.com/nyaaan/
のscreamの部分がアプリケーションに相当します。
普通は機能単位に作るので。
apiとかcmsとかって名前を付けるみたいです。
そうすると、shatiku配下にこんなフォルダが出来ます。
screamフォルダ
__init__.py
admin.py ・・・モデルの管理サイト
apps.py ・・・気にしない(使ったことない)
migrations/
__init__.py
models.py ・・・モデルの定義を書きます
tests.py ・・・とりあえず気にしない
views.py ・・・処理を書く
また.pyが増えてパニック!
ですが、ここにurls.pyを作ります。
__init__.py
admin.py ・・・モデルの管理サイト
apps.py ・・・気にしない(使ったことない)
migrations/
__init__.py
models.py ・・・モデルの定義を書きます
tests.py ・・・とりあえず気にしない
urls.py ・・・urlを書くよ!
views.py ・・・処理を書く
色々あってパニックですが。
以下の順番で考えていけば大丈夫です。
url.pyにはurlが書かれている。
(例えばscream/urls.pyにはnyaanと書かれるとして)
その状態で、以下のアドレスにアクセスすると(実際には存在しないアドレスです)
http://damedeath.co.jp/scream/nyaan
prject配下のurls.pyが screamは存在するからOKとしてscreamフォルダを呼んでくれます(多分)
次にscreamフォルダのurls.pyを読んで、nyaanは存在するからOKとしてくれます。
処理としては、そこからnyaanが来たときにはどの処理を呼ぶかをviews.pyに書けば、どの処理が呼ばれるか分かります。
これでもうきっとDjangoのファイル数の多さにパニック起こすことはないでしょう!
##migrateってなんぞ
Django1.7から導入されたマイグレートについてです。
会社で1.6以下を使っているからsouthだよって人は、個人的なものならDjangoバージョン上げましょう、仕事関係なら会社の人に聴いてください。
今新規なら1.9とかから始まるんじゃないでしょうか
これも最初良く分かりませんでしたが、簡単です。
ようは、Model.pyに書かれたテーブル定義をsettings.pyに書かれた接続先のデータベースに作成する作業です。
いくつかの手順を踏みますが
①モデルに宣言された内容を読み取ってmigrationファイルを作る
②migrationファイルの内容をデータベースに反映する
この2点だけです。
しかも、便利なことにmigrationファイルは履歴で管理しているので、データベースの設定を昔の状態に戻すこともできます。(とてもお勧め出来る作業ではありません。)
どこまでmigrationファイルが当たっているかは、実はDjangoにはそれを管理しているテーブルが自動で作られていてそこで管理されています。
いざとなれば、そこをいじることも出来ますが素人にはお勧めしない
##objects.getとかfilterとか分からん
いきなり、クエリの話に飛んでしまい恐縮ですが・・・
objects.get・・・レコードを一枚だけ取ってくる(0枚や複数枚取れたら例外が発生する!)
objects.filter・・レコードを複数枚取ってくる
こんなテーブルがあったとしましょう
SabizanTBL
ユーザー user(fk)
年月日 work_date
サビ残時間 sabizan_time
ユーザーと年月日でユニーク
Sabizan.objects.get(user="ホワイトさん")
→ホワイトさんはサビ残をしていないのでレコードが取れなかった!エラー
sabizan = Sabizan.objects.get(user="社蓄さん", work_date=2016-12-15)
→一枚だけ取れるのでok
sabizan.sabizan_time ←これで12月15日のサビ残時間が分かる
sabizans = Sabizan.objects.filter(user="社蓄さん")
これで複数枚取れる!
じゃあ、これを一枚一枚にするにはどうしたら良いでしょうか?
for sabizan in sabizans:
sabizan.sabizan_time
所詮は配列なのでループしてやればおkです。
とりあえず、adventカレンダーの期限が過ぎていたので、急いで書きましたが、こんなもんでどうでしょうかね??