Django モデルを作ってマイグレーション
最近研究がとても忙しいが,Djangoの勉強が楽しいので時間の使い方が難しい.
前回はAppを追加する部分までの操作をまとめた.
maikocho.hatenablog.com
今回は,実際にモデルを簡単に書いてみるのと,データベース利用に関する操作を整理する.
データベースは直接の操作もできるが,マイグレーションという機能で,手間が大幅に減る.
最初は大変だったんだけど,とにかく楽できるんだなということは意識しておきたい.
楽を覚えると,楽のために生まれた穴に気づきにくい.
時間ができたら実際のデータベース操作や,マイグレーションがどうやって機能しているかも勉強していこう.
では,まずAppのモデルを実際に書いてみる.
models.pyを編集する
App本体を作ったはいいが,中身がないと意味がない.
まずは,どんな機能が必要になりそうかスケッチを見て考えよう.
モデルは1つのAppにつき,1つで考えれば良いらしい.
まずは,前回作ったAppのディレクトリ内のmodels.pyを開く.
import文が1つあるだけ.ここにclassを追加する.
コードを書く前に,実装する機能についても考える.
例えば,Blogの方は新着記事のまとめをいくつか表示したいとする.
記事のまとめ(summary)があるといいだろう.
また,サムネイル画像もあるといいかもしれない.
以上の考えから,models.pyに次のようなコードを書く.
class Blog(models.Model): image = models.ImageField(upload_to='images') summary = models.CharField(max_length=300)
フィールドについては,Djangoのモデルフィールドのリファレンスを参照する.
モデルフィールドリファレンス | Django documentation | Django
imageのupload_toの部分は,後述のメディアURLが/media/だった場合に,
画像のパスが,「/media/images/ファイル名」となるらしい.
まぁとにかく,こんな感じでモデルを作っていく.
プロジェクト本体にAppが追加されたことを知らせる
Appを作っただけでは,本当に作っておいてあるだけである.
プロジェクト本体に,Appがこのプロジェクトに追加されますよーと教えてあげないといけない.
プロジェクト内部,プロジェクト名のディレクトリ内にあるsettings.pyを開こう.
中頃にこんな部分があると思う.
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
ここに,自分の作成したAppを追加する.
blogを追加する場合は次のようになる.
INSTALLED_APPS = [ 'blog.apps.BlogConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
'ディレクトリ名.apps.class名'となっている.
名前の構造でわかるが,Appディレクトリのapps.py内にあるクラスを指定している.
画像を扱う部分も追加する
settings.pyの最下部にさらにコードを追加する.
先述のメディアURLに関わる部分だ.
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/'
これでmodelに関してデータが保存されれば,mediaというフォルダをプロジェクト直下に作成し,格納してくれる.
ここまで来たら,runserverした時にターミナル上に出ていた赤文字を思い出して欲しい.
実は,migrateしろ的なことが書かれていた.
これは,プロジェクトで使うデータベース機能をちゃんと使うための準備をしろ.
ということだと思えばいい.
このmigrateに関して,細かいことは次のページを参考にさせていただく.
qiita.com
では,次のコマンドを実行しよう.
(myvenv)$ python manage.py migrate
これでデータベース利用のための最低限の準備はできた.
しかし,現時点でプロジェクトに大きな変更がある.
そう,Appを追加したことである.
このことも知らせないといけない.
実は,このためにsettings.pyで追加した旨を記述したのだ.
次のコマンドを実行しよう.
(myvenv)$ python manage.py makemigrations
もしかすると,Errorが出たかもしれない.
画像に関するフィールドを追加したので,画像処理のライブラリが必要だと言われた.
エラーメッセージに従ってPillowというライブラリをインストールする.
(myvenv)$ pip install Pillow
Pillowについては,以下のサイトで勉強させていただく.
note.nkmk.me
これで大丈夫なはずだ.
もう一度,makemigrationsを行おう.
データベースの更新
migrateした後にAppに関する部分を操作し,make migrationsというのをした.
makeしたので,それらを適応しないといけない.
したがって,もう一度次のコマンドを実行する.
(myvenv)$ python manage.py migrate
これでモデル作成に関して,必要な操作は完了した.
ただ,今後モデルに関してコードを変更することもあると思う.
その場合は変更に対してまた
(myvenv)$ python manage.py makemigrations
を行い,
(myvenv)$ python manage.py migrate
を実行するという流れを忘れないようにする.