まいこーmemog

生きづらいとき人の言葉で生き返るので,自分も言葉にしてみる.[memo+blog]

Django モデルを作ってマイグレーション

最近研究がとても忙しいが,Djangoの勉強が楽しいので時間の使い方が難しい.
前回はAppを追加する部分までの操作をまとめた.
maikocho.hatenablog.com

今回は,実際にモデルを簡単に書いてみるのと,データベース利用に関する操作を整理する.
データベースは直接の操作もできるが,マイグレーションという機能で,手間が大幅に減る.
最初は大変だったんだけど,とにかく楽できるんだなということは意識しておきたい.

楽を覚えると,楽のために生まれた穴に気づきにくい.
時間ができたら実際のデータベース操作や,マイグレーションがどうやって機能しているかも勉強していこう.

では,まずAppのモデルを実際に書いてみる.

models.pyを編集する

App本体を作ったはいいが,中身がないと意味がない.
まずは,どんな機能が必要になりそうかスケッチを見て考えよう.

f:id:maikocho:20181111215144p:plain
ポートフォリオプロジェクトのスケッチ

モデルは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

を実行するという流れを忘れないようにする.

まとめ

いろんな知識が出てきた.
勉強すべきことはどんどん増える.

トップダウン的な勉強か,ボトムアップ的な勉強かは分野によって向き不向きがある.
でも,プログラミングは前者でないと過去の遺産が多すぎていつまでも目標にたどり着けない気がする.

関係ないけど最近寒いので,風邪には気をつけたい.