PythonMania

普段はロボットとAIを組み合わせて色々作ってます。Python関係以外も色々投稿していくと思います。

【Python】Djangoのmodels.pyについてまとめてみた

f:id:mizuhiki0111:20190430175940p:plain



前回の記事で画像ファイルのアップロードフォームを作成した際にmodels.pyのImageFieldを使用しましたが、どのような仕組みでデータベースと連携しているのか分かりにくかったので簡単にまとめてみます。






DjangoはSQLを書かなくてもデータベースを操作できる

Webアプリケーションを開発するときには、データをデータベースに格納したり、格納したデータ使ってを様々なことを行ったりします。

例えば名前やメールアドレスなんかを登録してログインする際の認証に使ったりしますが、この場合は「名前」や「メールアドレス」といった情報がデータベースに保存され、これを取り出して使用したりしています。

このようなデータベースの情報の操作には通常「SQL」という言語が使われ、SQLでデータベースに対する命令を記載して使用します。
(例えば「SELECT * FROM TABLE_NAME~」みたいな感じ)


ですがDjangoで作成したアプリケーションでデータベースとのやり取りを行う場合には、この「SQL」を使用しなくてもPythonでデータベースとのやり取りを行うことができます。


このデータベースとのやり取りの基本となるのがmodel.pyになります。


実際にmodels.pyに記載した例を見ながら仕組みについて説明していきます。

from django.db import models

class Test(models.Model):
    class Meta:
        db_table = 'test' 

    hoge = models.TextField(max_length=100) 

    def __str__(self):
        return self.title


models.pyではmodelsクラスを継承してclassを定義することでデータベースのテーブルを作成することができます。


上記の場合は

class Test(models.Model):
    class Meta:
        db_table = 'test' 

の部分でmodelsクラスを継承したTestクラスを作成し、"test"という名前のテーブルを作成しています。

次に

 hoge = models.TextField(max_length=100) 

の部分ですがDjangoに標準で搭載されているfieldの関数を使用して「hoge」という文字列を扱うカラムを作成しています。


カラムは名前だけ作成すればいい、というものではなく、効率よくデータベースを運用するためにはデータ型やその他の制限を設定する必要があります。


Djangoにはデータ型に応じた様々なフィールドが用意されており、例として以下のようなものがあります。



「django.db.models.fields.BooleanField」:真偽値
「django.db.models.fields.CharField」:可変長文字
「django.db.models.fields.TextField」:文字列
「django.db.models.fields.IntegerField」:数値
「django.db.models.fields.FloatField」:浮動小数点
「django.db.models.fields.DateField」:日付
「django.db.models.fields.DateTimeField」:日付と時刻



例で挙げたコードでは文字列を扱うTexitFieldを使用してカラムを作成しており、引数に「max_length=100」とすることで最大文字数を100文字に制限しています。





このようにmodels.pyにデータベースの定義をした後、すぐにアプリケーションにデータベースが反映されるわけではありません。



まずデータベースが変更となったことを記載したマイグレーションファイルを作成します。


マイグレーションファイルを作成するにはコマンドラインで以下を実行します

python manage.py makemigrations アプリ名


マイグレーションファイルを作成した後は、実際にデータベースの変更を適用します

python manage.py migrate

これでデータベースの変更がアプリに適用されました。