この記事は自分が学習した内容を記録するために作成したものです。
理解するためのメモとして利用しているので、わかりにくい所があるのをご了承ください。
学習はDjangoの公式ドキュメントをメインに進める。
https://docs.djangoproject.com/ja/2.0/intro/
今日は、「はじめての Django アプリ作成、その 2」の途中まで学習をおこなったので、個人的なメモを以下に載せる。
初めてのDjangoアプリ作成、その1
Djangoの最初に行うセットアップ。プロジェクトを作成する。
$ django-admin startproject mysite
Django開発サーバーの起動
$ python manage.py runserver
pollsという名前のアプリを作成。
$ python manage.py startapp polls
rootにアプリケーションpollsのURLを反映させる。include()は他のURLconfへ参照が可能となる。
path関数では、root, view,(kwargs),(name)の4つの引数を受け取る。
初期ソースコードの変更部分だけ以下に載せる。
from django.urls import include, path
path('polls/', include('polls.urls')),
はじめてのDjangoアプリ作成、その2
データベースのテーブル作成
$ python manage.py migrate
モデルの作成(データベースのレイアウトと関連するメタデータ)
作成するアプリでは、投票項目(Question)と選択肢(Choice)の二つのモデルを作成する。
Questionには質問事項(question_text)と公開日(pub_data)の情報
Choiceには選択肢のテキストと投票数(vote)の二つのフィールドがあり、
各Choiceは1つのQuestionに関連づけされている。
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)
補足:
CharFIeld():文字のフィールド、max_lengthを指定する必要がある。
DataTimeField():日時フィールド
ForeignKey():インスタンスを保存するフィールドを作成する。そのフィールドと紐づけるモデルを第一引数に指定する。この場合questionはQuestionモデルに紐づく。
on_delete:紐付けされたインスタンスが削除された時の挙動を定義する。
on_delete=model.CASCADE:インスタンスを削除すると、Questionに紐づいたChoiceも削除する。
on_delete=model.PROJECT:インスタンスを削除しようとしても、Questionに紐づいたChoiceが存在する場合は削除をできないようにする。
「モデルを有効にする」
makemigrationsはDjangoのモデルに変更がある場合、新しいmigrationの形で保存を行う。
Djangoが行う変更を手動で管理したい場合に使用
$ python manage.py makemigrations polls
実行結果は以下の通りである。読みやすくするためにフォーマットは整えているので注意。
BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL
);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"choice_text" varchar(200) NOT NULL,
"votes" integer NOT NULL,
"question_id" integer NOT NULL REFERENCES
"polls_question" ("id") DEFERRABLE INITIALLY DEFERRED
);
CREATE INDEX
"polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;
id:キー
_id:外部キー
モデルの変更手順
① model.pyを変更
②マイグレーションを作成
③データベースに変更を適用
とりあえずここまで、後々更新しています。
##参考文献
Django公式ドキュメント
https://docs.djangoproject.com/ja/2.0/intro/
DjangoBrothers
https://djangobrothers.com