▶ まだdjangoのインストールがお済みでない方はこちらの記事をどうぞ
▶ プロジェクトの作成がお済み出ない方はこちらの記事をどうぞ
はじめに
前回は環境設定してプロジェクトの作成までおこないました。今回はこのプロジェクトの中にアプリケーションをつくっていきます。
Webアプリケーションは、背後で動いているデータベースと連携して動いています。そのため、データベースと連携させる設定が必要です。これを自動でおこなうのがmigrateという処理です。まずはここからやっていきましょう。
migrate
まずはデータベースと連携させる処理をおこないます。これから頻繁にでてきますが、django全体の設定などは「manage.py」を使います。いろんな引数を与えることで、それに応じた処理をすることができます。既に出てきたものでは、サーバーを立ち上げるときに「python manage.py runserver」としましたね。今回おこなうmigrateは次のようにします。
python manage.py migrate
この1行のコマンドだけで、データベースの設定をしなくても自動で開発用のデータベース(sqlite)が使えるようになります。
appの作成
次にappの作成です。これは前回やったように、Webアプリケーション全体をプロジェクトという箱で管理して、この箱の中に機能であるappがいくつかあるイメージとなります。このappをつくっていきます。前回の投稿を確認したい場合は、こちらをどうぞ。
appを作る場合も「manage.py」を使います。次のようにします。
python manage.py startapp polls
最後の「polls」がアプリ名になります。このコマンドを打つと、自動でアプリ名でフォルダができあがります。今回の例でいうと、「polls」というフォルダがプロジェクト「pollster」の配下にできあがります。
この「polls」フォルダの中に、今後のアプリケーション開発に必要なファイル群が自動で生成されます。
- __init__.py
- admin.py
- apps.py
- models.py
- views.py
モデルの作成
モデルは、データベースのテーブルをイメージするとよいでしょう。これを設定していきます。そのために、何を作るかを整理しておきましょう。
情報の整理
ここでは何をつくるか、の情報の整理をしておきます。今回、「polls」というappの箱を作りました。ここで管理したい情報は以下の2つのテーブルです。
- Questionテーブル
ここでは、「question_text」という設問と、「pub_date」という登録日を管理します。 - Choiceテーブル
ここでは、「question」というQuestionテーブルの設問を指定するもの、「choice_text」という回答の選択肢、「votes」という回答の投票数を管理します。
イメージとしては以下のようになります。
Questionの下にそれに紐づく選択肢となるChoiceが複数紐づく形となります。モデル内にForeignkeyを指定した段階でDjangoは構造を認識し、上位から下位を操作できるメソッド(xxx_set.create()やxxx_set.all()など)を提供してくれます。
モデルの作成
作りたいものの確認をすることができました。QuestionとChoiceという2つのテーブルがあり、これらは従属関係にあるのでした。それぞれのテーブルの項目は上に記したとおりです。では、実際に作っていきましょう。モデルを作るには、「models.py」を編集していきます。
(models.py)
# defaultで記載されている
from django.db import models
# Questionテーブルを定義
class Question(models.Model):
question_text=models.CharField(max_length=200)
pub_date=models.Datefield('date published')
# Questionというテーブルを管理画面でどう表示するか
def __str__(self):
return self.question_text
class Choice(models.Model):
question=models.Foreignkey(Question, on_delete=models.CASCADE)
choice_text=models.CharField(max_length=200)
vote=models.IntegerField(default=0)
def __str__(self):
return self.choice_text
Choiceクラスのquestionの定義のところで、Foreignkey(Question,on_delete=models.CASCADE)という記述をしています。ここは、まず第一引数のQuestionは、上で作ったクラスQuestionを管理したい、ということを表します。Questionとの依存関係を定義している部分となります。次に、「on_delete」の部分ですが、依存関係にある親の項目が削除された時の挙動を定義します。protectを指定すると、親項目が削除されても残る、CASCADEを指定すると親項目とともに削除される、となります。
これでモデルができました。ただ、このままではまだ使えませんプロジェクト内で扱えるようにする処理が必要となります。
appの登録とmigrate
作成したappをプロジェクト内で使えるようにするには、プロジェクトの「setting.py」ファイルにappを追加する必要があります。
(pollster/pollster/setting.py)
~略~
# Application definition
INSTALLED_APPS={
'polls.apps.PollsConfig,
********
}
~略~
「setting.py」の中で「Application definition」の記述をみつけて、このすぐしたの「INSTALLED_APPS」の部分に作成したappを追加します。ここでは、「polls.apps.PollsConfig」という書き方をしています。この意味は、pollsというフォルダ配下に「apps.py」というファイルがあり、この中に定義されている「PollsConfig」という意味になります。
「apps.py」の中身を見ると、次のように記載されています。
さらにデータベースとの接続をする必要があります。これには「migrate」という作業が」必要となります。新しくモデルを作った場合は、「makemigrations」をしてから、そのあとに「migrate」をおこないます。これをワンセットで覚えておくとよいですね。makemigrationsでは設定ファイルを作って、migrateで実際にデータベースとの連携を確立するイメージとなります。
python manage.py makemigrations polls
pollsはアプリ名となります。今回は、「polls」というアプリの設定ファイルを作る、ということになります。これを実行すると、pollsフォルダの配下に「migrations」というフォルダが出来上がります。
まだ設定ファイルができただけですので、実際の連携設定をするために、migrateをします。このときにも、「manage.py」を使います。
python manage.py migrate
これでいま作ったpollsというappがデータベースと連携するようになりました。
データベースにデータを登録する
ここで少し寄り道をします。いまつくったデータベースにターミナルからデータを追加してみましょう。まずはインタラクティブなpythonシェルを立ち上げましょう。次のようにします。
python manage.py Shell
このシェルはdjangoのプロジェクトの中で走っていて、いま作ったモデルを直接扱うことができます。※>>>という表記となり、pythonのインタラクティブモードになっています。ここで次のようにしてデータを加えていきましょう。
# 作成したクラスQuestion, Choiceをインポート
from polls.models import Question,Choice
from django.utils import timezone
# インスタンスを作る
q=Question()
q.question_text='1番好きな果物は?'
q.pub_date=timezone.now()
q.save()
c=Choice()
c.question=q # 親のインスタンスを指定する
c.choice_test='りんご'
c.votes=0
c.save()
これでモデルにデータが登録されました。これを確認するには、次のコマンドを打ってみてください。
Question.objects.all()
残りのchoiceは、djangoが提供するForeignkeyの機能を使って設定してみましょう。Foreignkeyを設定した場合は、次のメソッドが自動生成されている。
- (下位のクラス名の小文字)_set.create( )
- (下位のクラス名の小文字)_set.all( )
今回の例では、上位:Question、下位:Choiceなので、
- choice_set.create( )
- choice_set.all( )
というメソッドを使うことができる。このchoice_set.create( )を使ってChoiceテーブルにデータを登録することができる。
q.choice_set.create(choice_text='みかん',votes=0)
q.choice_set.create(choice_text='バナナ',votes=0)
これで先ほどと同じようにデータを登録することができた。ここでインスタンスqに対してどんなデータが登録されているかは、q.choice.all( )で確認することができる。
q.choice_set.all( )
まとめ
いかがでしたでしょうか?今回はappの作成をして実際にデータを登録するところまで試しました。だんだん、いろんな設定項目が出てくるのでややこしくなってきます。しっかり復習しておきましょう。次回は、Admin部分の設定について扱います。
▶ djangoのサマリ記事もあります。
コメント