あれもPython,これもPython

Pythonで世界を包みたい

Cloud9でDjango入門(3_Modelの定義)

WebフレームワークとしてのDjango

DjangoはWebフレームワークであるので、
Webアプリケーションを開発するにあたって必要だが複雑な実装を
隠ぺいしてくれます。

そのためWebアプリケーションの開発の際は、
Djangoの規則に基づいて実装することで、
ド定番の機能の実装が不要になります。

といってもアプリケーションごとに変動する部分もあるため
、 それをうまい具合に切り分けた実装モデルをDjangoではMTVモデルと呼んでいます。

MTVモデル

MTVモデルはModel,Template,Viewの3要素からなる実装モデルです。
Djangoの開発の基本はこのモデルを自分のアプリケーションに基づいて実装することです。

Model

Modelはどのようなデータを操作するか、の定義です。
たとえば、SNSアプリケーションでは、
ユーザの基本情報や、コメントなどのデータを格納することになります。
そうした、どんな要素を持ったデータを扱うか、と
それはどう操作されるかという機能をModelに実装します。

どんなデータがどんな要素を持っているかは、
最終的にはデータベースに格納されるわけですが、
Djangoを使用する場合、SQLでデータベースを操作する必要がありません。
Djangoのアプリケーションで定義したモデルをデータベースに反映する機能が
フレームワーク側に組み込まれているためです。

というわけでModelを定義していきましょう。

python manage.py startapp sns

これでsnsアプリケーションのディレクトリが作成されました。
この中にはすでにmodels,pyファイルが作成されています。
models.pyにアプリケーションで使用するモデルを定義していきます。

from django.db import models

class Comment(models.Model):
    content = models.CharField("書き込み",max_length=140)

models.pyのデータのまとまりはクラスで表現します。
この際djangoのModelを継承します。
このクラスを継承することで、保存や更新など、データ操作に必要な機能を
自分で実装することとなく持たせることが可能になります。

また、このクラスのまとまりがリレーショナルデータベースのテーブルに該当し、
要素がカラムとなります。

同一のアプリケーションにほかの種類のデータも持たせたい場合は、
models.pyにクラスを追加していけば大丈夫です。

fieldの扱い

XXXFieldはテーブルのカラムに該当します。
データベースではカラムに型やlengthなどの定義が必要となることがあるため、
XXXfieldのXXX部分や引数でモデルに定義してやり、
データベース反映するとDjangoがよろしく作ってくれます。

たとえば文字列を表すCharFieldや整数を表すIntegerField、日付時刻を表すDatetimeFieldなどが定番どころでしょうか。 どんなものがあるかは公式レファレンスを見ていただきつつ、適宜データベースの型について勉強するのが良いかと思います。

その他リレーション定義や、主キー定義、
form作成時に便利なFileField,ImageFieldなどもありますが、
ここではいったん省略します。

データベースへの反映

先ほど作成したモデルを実際のデータベースに反映させます。
python manage.py migrateで反映させることになりますが、
その前にDjangoにこのモデルを持つapplicationが作成中のwebアプリケーション(プロジェクト)の中で必要であることを
明示します。

setting.pyINSTALLED_APPSのリストの中に先ほどのapplication名を追加します。

そのあとpython manage.py makemigrationを実行し、migrateファイルを作成します。
migrateファイルはmigrate内容が保存されるファイルで、makemigrationするたびに追加されます。
このmigarateファイルをpython manage.py migarateしてデータベースに反映します。

初めて作成したモデルであればテーブルが作成されます。
すでにデータが入っている場合や、カラムの型変更が発生する場合、
警告が表示されます。

と、これでModelの基本は終わりなので、
データベースに反映させたら、
残りのTemplateやViewの開発を進めていきます。