Django は、安全でメンテナンスしやすいWebサイトやWebアプリを迅速に開発するための、よく知られたWebフレームワークです。Python を使用して構築されたDjangoは、Web開発を簡素化し、毎回車輪の再発明をすることなく、アプリの作成により多くの時間と集中力を割くことができます。Djangoは、堅牢な公式ドキュメント、優れたコミュニティサポート、そして多くの無料および有料のサポートを備えた、無料のオープンソースプロジェクトです。
このガイドでは、Djangoモデルの作成について深く掘り下げていきます。 Djangoにおいて、モデルはデータに関する情報の重要なソースです。モデルは、保存されるデータのフィールドと動作を記述します。Djangoはモデルを使用して、ORM(オブジェクト関係マッピング)を用いてデータベーステーブルを生成します。これらはモデルとも呼ばれます。
前提条件
ここではUnixベースのオペレーティングシステム、好ましくはテスト済みのシステムである Ubuntu 20.04 クラウドサーバー を使用します。同様の環境でDjangoをセットアップしたい場合は、チュートリアル「Ubuntu 20.04にDjangoをインストールし、開発環境をセットアップする方法.”
ステップ 1. Python開発環境
DjangoはPythonで構築されています。そのため、Pythonアプリを操作するために必要なすべてのツールを備えた、堅牢なPython開発環境が必要です。これについては、すでに専用のガイドで説明しています。ここでは、簡単なデモンストレーションを行います。
まず、ターミナルを起動して次のコマンドを実行します。
|
1 2 |
$ sudo apt update && sudo apt upgrade -y $ sudo apt install python3 python-is-python3 |
次に、Pythonのパッケージマネージャーである pip – をインストールします。
|
1 |
$ sudo apt install python3-pip |
その後、いくつかの追加の開発パッケージをインストールします。
|
1 |
$ sudo apt install build-essential libssl-dev libffi-dev python3-dev |
仮想環境を構築するには、Pythonの venv モジュールも必要です。
|
1 |
$ sudo apt install python3-venv |
ステップ 2. MySQLサーバーのインストール
MySQLは、人気のある関係データベース管理システムです。オープンソースで安定しており、機能が豊富です。Djangoアプリのデータベースサーバーとして MySQL を使用します。APTを使用してMySQLをインストールします。
|
1 |
$ sudo apt install mysql-server |
次に、インストールを確認します。
|
1 |
$ systemctl status mysql |
これはデフォルトのオプションを使用したMySQLの最小限のセットアップにすぎません。詳細なガイドについては、MySQLのインストールと設定.
ステップ 3. Djangoアプリのセットアップ
これでDjangoアプリを作成する準備が整いました。Djangoのさらに詳細なデモンストレーションに関心がある場合は、チュートリアル「Ubuntu 20.04へのDjango Webフレームワークのインストール.”
次に、アプリ専用のディレクトリを作成します。ディレクトリ名はプロジェクト名を反映したものにする必要があります。
|
1 |
$ mkdir -pv <project_dir> |
プロジェクトディレクトリ内で、venv モジュールを使用してPython仮想環境を作成します。
|
1 |
$ python3 -m venv <virtual_env_name> |
仮想環境を有効化します。
|
1 |
$ . sample_app_env/bin/activate |
を使用してDjangoをインストールします。 pip:
|
1 |
$ pip install django |
次に、django-admin コマンドを使用して、新しいDjangoプロジェクトを作成します。
|
1 |
$ django-admin startproject sample_app |
ステップ 4. Djangoアプリの設定
Djangoアプリには、すべてのデフォルト設定が含まれています。目的を達成するために、いくつかの調整を行う必要があります。
まず、設定ファイル settings.py:
|
1 |
$
$ nano sample_app/sample_app/sample_app/settings.pynano /sample_app/sample_app/sample_app.settings |
py
|
1 |
$
$ TIME_ZONE = '<time_zone>' = TIME_ZONE |
'<time_zone>'
|
1 |
$
$ ALLOWED_HOSTS = ['<allowed_host_ip_or_domain_name >'] = [ALLOWED_HOSTS] |
'<allowed_host_ip_or_domain_name >'
|
1 |
$
$ python manage.py migratepython .managepy |
migrate
|
1 |
$
$ python manage.py createsuperuserpython .managepy |
ステップ 5. DjangoアプリをMySQLに接続する
MySQLに接続するには、Djangoと互換性のある追加のPythonコネクタライブラリが必要です。ここでは、mysqlclient.
まず、必要なパッケージがインストールされていることを確認します。
|
1 |
$ sudo apt install python3-dev libmysqlclient-dev default-libmysqlclient-dev |
次に、以下をインストールします: mysqlclient:
|
1 |
$ pip install mysqlclient |
- 専用データベースの作成
アプリ用に、専用のデータベースとデータベースユーザーを作成する必要があります。MySQLシェルを以下として起動します: root:
|
1 |
$ sudo mysql -u root |
|
1 |
$ CREATE DATABASE <dedicated_database>; |
次に、Djangoアプリ用の専用データベースユーザーを作成します:
|
1 |
$ CREATE USER '<username>'@'%' IDENTIFIED WITH mysql_native_password BY '<user_password>'; |
最後に、専用ユーザーに専用データベースに対するすべての権限を付与します:
|
1 |
$ GRANT ALL ON <database>.* TO '<username'@'%'; |
- MySQLを使用するためのDjango設定の変更
次に、MySQLをデータベースサーバーとして使用できるように、Djangoの設定をいくつか調整する必要があります。テキストエディタで以下を開きます: settings.py をテキストエディタで開きます:
|
1 |
$ nano settings.py |
下にスクロールして、DATABASES セクションに移動し、次のコードを貼り付けます:
|
1 2 3 4 5 6 7 8 |
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'OPTIONS': { 'read_default_file': '/etc/mysql/my.cnf', }, } } |
次に、必要なデータベースの資格情報が含まれるようにMySQL設定ファイルを編集します:
|
1 |
$ sudo nano /etc/mysql/my.cnf |
ファイルの末尾に次のブロックを追加します:
|
1 2 3 4 5 |
[client] database = <dedicated_database> user = <dedicated_user> password = <user_password> default-character-set = utf8 |
変更を有効にするためにMySQLを再起動します:
|
1 2 |
$ sudo systemctl daemon-reload $ sudo systemctl restart mysql |
Step 6. Creating a Django Model
これで、Djangoプロジェクト内に新しいモデルを作成する準備が整いました。仮想環境をアクティベートします:
|
1 2 3 |
$ cd sample_app/ $ . sample_app_env/bin/activate $ cd sample_app/ |
この場所で、Djangoに新しいアプリを作成するように指示します:
|
1 |
$ python manage.py startapp <new_app> |
作成後、ファイルツリーは以下のようになります。ここで、ファイルmodels.py には、カスタムDjangoモデルのコードが含まれます:
ファイルの現在の内容を確認します:
|
1 |
$ cat models.py |
デモンストレーションとして、Post という名前のブログ投稿用モデルを作成します。これには以下のフィールドが含まれます:
title: ブログ投稿のタイトル。slug: ウェブページの有効なURLを保存および生成します。content: ブログ投稿の本文。created_on: 投稿の作成日。author: 投稿を作成したユーザー。
ファイルmodels.py をテキストエディタで開きます:
|
1 |
$ nano models.py |
モデルに必要なAPIをいくつかインポートしましょう。デフォルトでは、models APIがインポートされます。また、スラッグを生成するためのslugify API、認証用のUser 、そしてより柔軟で優れたURL作成のためのreverse も必要になります:
|
1 2 3 4 |
from django.db import models from django.template.defaultfilters import slugify from django.contrib.auth.models import User from django.urls import reverse |
次に、Post というクラスメソッドを追加します。これには、title, slug, content, created_on, および author:
|
1 2 3 4 5 6 |
class Post(models.Model): title = models.CharField(max_length=255) slug = models.SlugField(unique=True, max_length=255) content = models.TextField() created_on = models.DateTimeField(auto_now_add=True) author = models.TextField() |
URLの生成と投稿の保存を行う機能が必要です。これは、ユニークな投稿に対応するユニークなリンクを生成するために重要です:
|
1 2 3 4 5 6 7 |
def get_absolute_url(self): return reverse('blog_post_detail', args=[self.slug]) def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.title) super(Post, self).save(*args, **kwargs) |
次のセクションでは、投稿の並び替えとウェブページへの表示についてモデルに指示します。インナークラスである Meta を使用してロジックを記述します。これには、データベースのフィールド定義に関係のない追加のモデルロジックが含まれます:
|
1 2 3 4 5 |
class Meta: ordering = ['created_on'] def __unicode__(self): return self.title |
最後に、このファイルに Comment モデルの機能を追加します。これには、Comment クラスを、models.Model をシグネチャとして追加する必要があります。これには以下のデータベースフィールドが含まれます:
- name: コメント投稿者の名前。
- email: コメント投稿者のメールアドレス。
- text: コメント自体の内容。
- post: コメントが投稿された記事。
- created_on: コメントが作成された日時。
コードは以下のようになります:
|
1 2 3 4 5 6 7 |
class Comment(models.Model): name = models.CharField(max_length=42) email = models.EmailField(max_length=75) website = models.URLField(max_length=200, null=True, blank=True) content = models.TextField() post = models.ForeignKey(Post, on_delete=models.CASCADE) created_on = models.DateTimeField(auto_now_add=True) |
この時点で、models.py ファイルは以下のようになります:
最後に、ファイルを保存してエディタを閉じます。
ステップ 7. Django設定の更新
モデルが作成されました。しかし、モデルを動作させるにはいくつかの設定ファイルを調整する必要があります。settings.py 内で、以下の項目の下にモデルを追加する必要があります:INSTALLED_APPS.
テキストエディタで settings.py を開きます:
|
1 |
$ nano settings.py |
次のセクションの下に新しいモジュールを登録します:INSTALLED_APPS:
ファイルを保存してエディタを閉じます。
ステップ 8. 変更のマイグレーション
必要なモデルをすべて追加したので、次のステップはこれらの変更を適用することです。DjangoはこれらのスキーマをMySQLデータベースに適用します。
次のコマンドを実行すると、必要なすべてのマイグレーションファイルが生成されます。出力には、プロジェクトディレクトリ内におけるそれらのファイルの場所が表示されます:
|
1 |
$ python manage.py makemigrations |
次のコマンドを実行すると、既存のすべてのマイグレーションが一覧表示されます:
|
1 |
$ python manage.py showmigrations |
なお、0001_initial 以外のすべてのマイグレーションにマークがついています。このマイグレーションは、モデル Post および Comment の一部として作成されたものです。.
次のコマンドを実行すると、マイグレーションを実行するためにDjangoが実行するSQLクエリが表示されます:
|
1 |
$ python manage.py sqlmigrate random_app 0001_initial |
あとはマイグレーションを適用するだけです。これらのマイグレーションによって、変更がデータベースに書き込まれます:
|
1 |
$ python manage.py migrate |
ステップ 9. 変更の検証
変更を検証するために、MySQLデータベースを確認してみましょう。DjangoユーザーとしてMySQLシェルを起動します。
|
1 |
$ mysql sample_app_data -u sample_app_user |
次に、現在アクティブなデータベースをDjangoアプリのデータベースに変更します。
|
1 |
$ USE <django_dedicated_database>; |
データベースからすべてのテーブルを一覧表示します。
|
1 |
$ SHOW TABLES; |
最後に、いずれかのテーブルの内容を確認するには、DESCRIBE クエリを使用します。
|
1 2 |
$ DESCRIBE random_app_comment; $ DESCRIBE random_app_post; |
MySQLにおけるDjango의制限事項
DjangoアプリのデータベースサーバーとしてMySQLを使用する場合、いくつかの注意点があります。
- スキーマ変更プロセスに関するトランザクションのサポートはあまりありません。つまり、マイグレーションが失敗した場合、別のマイグレーションを試す前に、すべての変更を手動で元に戻す必要があります。失敗したマイグレーションが実行される前の時点にロールバックする方法はありません。
- ほとんどのスキーマ変更プロセスにおいて、MySQLはテーブルを完全に書き換えます。状況によっては、非常に時間がかかることがあります。最悪の場合、時間計算量は追加される行数または削除される列数に比例します。Djangoの公式ドキュメントによると、100万行あたり1分かかる可能性があります。
- MySQLは、カラム、テーブル、およびインデックスの名前の長さに文字数制限を設けています。また、すべてのカラムとインデックスカバーの合計サイズにも制限があります。Djangoは制限を超える可能性があります。MySQL以外のいくつかのバックエンドは、Djangoの高い制限に対応できます。
そのため、選択肢を慎重に検討し、適切なものを選択することを強くお勧めします。
おわりに
このガイドでは、既存のDjangoアプリにモジュールを追加する方法を説明しました。アプリのバックエンドとしてMySQLを使用しました。また、モデル、マイグレーションの仕組み、DjangoがモデルをMySQLデータベーステーブルに変換する方法など、Djangoのいくつかの重要な概念についても紹介しています。
ハッピーコンピューティング!






















コメント
コメントはまだありません。最初のコメントを投稿しましょう。