モデル (Model) の基礎
Django には、定義したデータモデルをデータベースと同期させる仕組み (いわゆる ORM) に加えて、 データモデルをプログラムから柔軟に操作するための API が用意されています。
ここでは MySQL をバックエンドのデータベースとして、モデルを定義して利用する基本的な方法を示します。
MySQL の設定を行っていない人は、先に MySQL の設定をしてください。MySQL の設定は「データベースの設定 - MySQL」をみてください。
ここでは Django プロジェクト名を myprj、Django アプリケーション名を myapp1 と想定しています。
モデルの作成
それでは、ここでは具体的に Company (会社) と Employee (従業員) というモデルを作成してみましょう。 データモデルは django.db.models.Model から派生させます。
アプリケーションディレクトリ内の models.py を次のように編集します。
from django.db import models
class Company(models.Model):
name = models.CharField(max_length = 100)
website = models.URLField()
class Employee(models.Model):
company = models.ForeignKey(Company, on_delete=models.CASCADE)
firstname = models.CharField(max_length = 100)
lastname = models.CharField(max_length = 100)
email = models.EmailField()
マイグレーションの準備
models.py を編集したら、次のコマンドを実行します。
$ python manage.py makemigrations myapp1
アプリケーションが見つからないというエラーがでる場合は、INSTALLED_APPS にて Django アプリケーションが登録されているのを確認してください。
ここで myapp1 はアプリケーション名です。
コマンドの結果、myapp1/migrations ディレクトリにマイグレーション用のスクリプトが生成されます。
スクリプト名は 0001 などと番号が振られています。この番号を引数にして、次のコマンドを実行することで SQL のクエリーを確認できます。
$ python manage.py sqlmigrate myapp1 0001
さらに、試しに Company クラスの name フィールドの最大長を 100 から 200 に書き換えてみます。
...
class Company(models.Model):
name = models.CharField(max_length = 200)
...
models.py を書き換えたので、また次のコマンドを実行します。
$ python manage.py makemigrations myapp1
するとやはり、myapp1/migrations ディレクトリに、さらにこの変更をデータベースに反映させるためのスクリプトが作成されます。
データベースへの反映
この時点では、まだデータベースには何も行っていません。実際にデータベースに変更を反映させるのは次のコマンドです。
$ python manage.py migrate
これで MySQL に実際のテーブルが作成されます。
試しに MySQL の変更を確認してみましょう。先ほど紹介した管理コマンド dbshell で MySQL のコマンドラインユーティリティに入り、 テーブルのリストの取得、テーブルのスキーマ情報の取得をするには以下のようにします。
$ python manage.py dbshell ... Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show tables; +----------------------------+ | Tables_in_my_django_db | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_migrations | | django_session | | myapp1_company | | myapp1_employee | +----------------------------+ 12 rows in set (0.00 sec) mysql> describe myapp1_company; +---------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(200) | NO | | NULL | | | website | varchar(200) | NO | | NULL | | +---------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) mysql>
SQL Workbench などの GUI ツールに切り替えるのも良いですが、コマンドからさっと確認できるのはありがたいですね。
データの操作
それでは上記で作成したデータモデルを少し操作してみましょう。
管理コマンド shell を使って Python シェルを起動してモデルの操作をします。
$ python manage.py shell
コマンド例は次の通りです。
$ python manage.py shell Python 3.6.3 |Anaconda, Inc.| (default, Oct 13 2017, 12:02:49) [GCC 7.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from myapp1.models import Company >>> Company.objects.all() <QuerySet []> >>> c = Company(name='ABC Company', website='http://python.keicode.com/') >>> c.save() >>> Company.objects.all() <QuerySet [<Company: Company object>]> >>>
データモデルのオブジェクトを作成して、save メソッドを呼ぶことでバックエンドのデータベースに保存されます。
データベースのシェルで myapp1_company テーブルの中身をみると、 確かに上で保存したデータが入っています。
$ python manage.py dbshell ... Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select * from myapp1_company; +----+-------------+----------------------------+ | id | name | website | +----+-------------+----------------------------+ | 1 | ABC Company | http://python.keicode.com/ | +----+-------------+----------------------------+ 1 row in set (0.00 sec)
さらなる、データ操作方法については、引き続き次の記事をみてください。
以上、ここではデータモデルの定義とデータアクセスの方法について概要を説明しました。