モデルを作成する
Djangoでデータベース駆動型Webアプリケーションを作成する最初のステップは、モデル、つまりデータベース構造の設計と追加のメタデータを定義することです。
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
各モデルは、django.db.models.Modelクラスのサブクラスとして表されます。各モデルには多くのクラス変数があり、それらはすべてモデルのデータベースフィールドを表します。
各フィールドはFieldクラスのインスタンスです。たとえば、文字フィールドはCharFieldとして表され、日付と時刻のフィールドはDateTimeFieldとして表されます。これにより、各フィールドで処理されるデータのタイプがDjangoに通知されます。
Fieldクラスの各インスタンス変数の名前(question_textやpub_dateなど)もフィールド名であるため、マシンに適した形式を使用することをお勧めします。それらはPythonコードで使用し、データベースはそれらを列名として使用します。
オプションのオプションを使用して、フィールドの人間が読める名前を定義できます。この機能はDjangoの多くの内部で使用されており、ドキュメントの一部です。この名前がフィールドに指定されていない場合、Djangoは変数名であるマシンフレンドリ名を使用します。上記の例では、Question.pub_dateにわかりやすい名前のみを定義しました。モデル内の他のフィールドでは、それらのマシンフレンドリーな名前が人間フレンドリーな名前としても使用されます。
Fieldクラスの特定のインスタンスを定義するには、パラメーターが必要です。たとえば、CharFieldにはmax_lengthパラメーターが必要です。このパラメーターの使用は、データベース構造を定義するためだけでなく、データを検証するためにも使用されます。
フィールドは、複数のオプションのパラメーターを受け取ることもできます。上記の例では、デフォルト値である投票のデフォルト値を0に設定します。
最後に、ForeignKeyを使用して関係を定義したことに注意してください。これにより、すべてのChoiceオブジェクトがQuestionオブジェクトに関連付けられていることがDjangoに通知されます。Djangoは、多対1、多対多、1対1のすべての一般的なデータベース関係をサポートしています。
アクティベーションモデル
モデルの作成に使用された上記のコードスニペットは、Djangoに多くの情報を提供します。この情報を使用して、Djangoは次のことができます。
このアプリケーションのデータベーススキーマを作成します(CREATE TABLEステートメントを生成します)。
QuestionオブジェクトとChoiceオブジェクトを操作できるPythonデータベースAPIを作成します。
ただし、最初に、pollsアプリケーションをプロジェクトにインストールする必要があります。
このアプリケーションをプロジェクトに含めるには、構成クラスINSTALLED_APPSに設定を追加する必要があります。PollsConfigクラスはファイルpolls / apps.pyに記述されているため、その点線のパスは「polls.apps.PollsConfig」です。projectName / settings.pyファイルのINSTALLED_APPSサブキーに点線のパスを追加すると、次のようになります。
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
これで、Djangoプロジェクトに投票アプリケーションが含まれます。次に、次のコマンドを実行します
$ python manage.py makemigrations polls
次のような出力が表示されます。
Migrations for 'polls':
polls/migrations/0001_initial.py
- Create model Question
- Create model Choice
makemigrationsコマンドを実行することにより、Djangoはモデルファイルへの変更を検出し(この場合、すでに新しいファイルを取得しています)、変更を移行として保存します。
移行は、モデル定義(つまり、データベース構造)を変更するためのDjangoのストレージフォームです。これらは実際にはディスク上の一部のファイルにすぎません。必要に応じて、polls / migrations /0001_initial.pyに保存されているモデルの移行データを読み取ることができます。心配しないでください。移行ファイルを毎回読み取る必要はありませんが、人間が読めるように設計されています。これにより、Djangoの変更方法を手動で調整できます。
Djangoには、データベースの移行を自動的に実行し、データベース構造を同期的に管理するコマンドがあります。このコマンドは移行です。すぐに触れますが、最初に、移行コマンドが実行するSQLステートメントを確認しましょう。sqlmigrateコマンドは移行名を受け取り、対応するSQLを返します。
$ python manage.py sqlmigrate polls 0001
次のような出力が表示されます(出力を人間が読める形式に再編成しました)。
BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" (
"id" serial NOT NULL PRIMARY KEY,
"question_text" varchar(200) NOT NULL,
"pub_date" timestamp with time zone NOT NULL
);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
"id" serial NOT NULL PRIMARY KEY,
"choice_text" varchar(200) NOT NULL,
"votes" integer NOT NULL,
"question_id" integer NOT NULL
);
ALTER TABLE "polls_choice"
ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id"
FOREIGN KEY ("question_id")
REFERENCES "polls_question" ("id")
DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;
データベーステーブル名は、アプリケーション名(polls)と小文字のモデル名(質問と選択)によって連結されます。(必要に応じて、この動作をカスタマイズできます。)
主キー(ID)は自動的に作成されます。(もちろん、カスタマイズすることもできます。)
デフォルトでは、Djangoは外部キーフィールド名の後に文字列「_id」を追加します。(また、これはカスタマイズできます。)
外部キー関係はFOREIGNKEYによって生成されます。DEFERRABLEの部分を気にする必要はありません。すべてのトランザクションが実行された後、PostgreSQLに外部キー関係を作成するように指示するだけです。
生成されたSQLステートメントは、使用しているデータベースに合わせてカスタマイズされているため、auto_increment(MySQL)、serial(PostgreSQL)、integer primary key autoincrement(SQLite)など、データベースに関連するフィールドタイプは、Djangoによって自動的に処理されます。君は。一重引用符を使用するか二重引用符を使用するかなど、引用符に関連するものも自動的に処理されます。
sqlmigrateコマンドは、データベースで実際に移行を実行するのではなく、コマンドを画面に出力するだけで、Djangoが実行する必要があると考えるSQLステートメントを確認できます。これは、Djangoが何をするのかを知りたい場合、またはデータベース管理者であり、データベースをバッチで処理するためのスクリプトを作成する必要がある場合に役立ちます。
ここで、migrateコマンドを再度実行して、データベースに新しく定義されたモデルのデータテーブルを作成します。
$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Rendering model states... DONE
Applying polls.0001_initial... OK
このmigrateコマンドは、実行されていないすべての移行を選択し(Djangoは、データベースに特別なテーブルdjango_migrationsを作成することにより、実行された移行を追跡します)、それらをデータベースに適用します。つまり、モデルへの変更をデータベース構造に同期します。 。
移行は非常に強力な機能であり、テーブルを再削除して作成することなく、開発プロセス中にデータベース構造を継続的に変更できます。データを失うことなくデータベースをスムーズにアップグレードすることに重点を置いています。この部分の詳細については、次のチュートリアルで学習します。今のところ、モデルの変更には次の3つの手順が必要であることを覚えておく必要があります。
- models.pyファイルを編集してモデルを変更します。
- python manage.py makemigrationsを実行して、モデル変更用の移行ファイルを生成します。
- python manage.pymigrateを実行してデータベース移行を適用します。
データベースの移行は、生成とアプリケーションの2つのコマンドに分割されているため、コード制御システムで移行データを送信して、複数のアプリケーションで利用できるようになります。これにより、開発が容易になるだけでなく、他の開発者にも使用できるようになります実稼働環境での利便性をもたらします。