モデル (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)

さらなる、データ操作方法については、引き続き次の記事をみてください。

モデル (Model) - データアクセスの基礎

以上、ここではデータモデルの定義とデータアクセスの方法について概要を説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Python 入門