#前回の記事
前回の記事→とにかくわかりやすく!Djangoでアプリ開発!ーその4ー
上記の記事までのまとめ→[Python]とにかくわかりやすく!Djangoでアプリ開発!ー中間まとめ[1-4]ー
※前回までの記事、おかげさまでユーザーランキング7位までいきました。ありがとうございます。
#本記事の目的
python初心者の方が、本記事を見たあとに、一人でアプリ開発できることを目的にしております。
※インストールや開発環境については記載しません
#環境
macOSX Sierra
python3.7
django 2.1.5
#前回まで
プロジェクトを立ち上げ(startproject)
→アプリの作成(startapp)
→view.pyを変更してレスポンスを書く
→urls.pyを修正する
→アプリの登録する
→index.html作る
→views.pyを直す
→htmlに変数入れる
→views.pyを直す
→複数ページ作るためにリンクつける
→views.pyを直す
→cssで装飾できるようにする
→htmlでフォームを作る
→views.pyを直す
→urls.pyを修正する
→やっぱりFormクラスでフォームを作る
→views.pyを直す
→index.html直す
→Viewクラスでview.pyをスッキリさせる
→Fieldをいじってみる
とここまででした。
ここからはDBとの連携を記載していきます。
#DBについて
Djangoで使えるSQLは以下になっています。
- MySQL:サーバータイプなのでwebサーバーとDBサーバーの間で通信を行います。
- PostgresQL:サーバータイプなのでwebサーバーとDBサーバーの間で通信を行います。
- SQLite:エンジンタイプなのでDBに直接アクセスを行います。
がDjangoにはすでにSQLiteが組み込まれています。そのファイルもすでにdb.sqliteとして用意されていますね。
#DBの設定を見てみる
設定に関することなので、myapp/settings.pyを見てみます。
デフォルトで設定されている項目が2つあります。
DBへのアクセスに使われるENGINEとDBそのものの名前を表すNAMEです。
os.path.joinはディレクトリパスを繋げているだけなので難しくないですね。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
僕はPostgreSQLを使うことが多いので以下の設定にすることもあります。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': postgres,
'USER': ユーザー名,
'PASSWORD': パスワード,
'HOST': ホスト名,
'PORT': '5432',
}
}
#テーブルを作る
ユーザー情報を管理できるようにテーブルを作成してみたいと思います。
テーブル定義に関しては割愛しますが、以前投稿したこちらのDB構築の記事を参考にしてください。
でここからが大事になってきます。
テーブル定義をした後にSQLでcreate文でテーブルを作る必要はなく、models.pyで定義をしておけば、自動で生成をしてくれます。便利ですね。
モデルでclassを作り、それのインスタンスをテーブルのレコードとして利用することができます。
ということでmodels.pyを書き換えていきます。
今回はユーザー情報テーブルを作っていきます。冒頭にあるmodelsというクラスを継承して作成できるので簡単です。
__str__
を用意して、内容をreturnで返せるようにしています。あとあとindex.htmlで{{}}で埋め込めます。
from django.db import models
class Touroku(models.Model):
name = models.CharField(max_length=30)
gender = models.BooleanField()
age = models.IntegerField(default = 0)
def __str__(self):
return '<ID:'+str(self.id)+'> 名前:'+self.name+' ('+str(self.age)+'歳)'
ここまでできたら、DBの立ち上げやアップデートに行うための「マイグレーション」を行います。
やることは2つだけ。「作成」と「適用」だけです。簡単です。
ターミナルで以下を打ち込みます。ディレクトリはmanage.pyがあるところです。
$ python manage.py makemigrations #作成
$ python manage.py migrate #適用
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length
Applying sessions.0001_initial... OK
エラーがでなければOKです!一度管理ツールを使ってDBを確認しておきます。
ということで管理者を作成しておきます。
*パスワードが雑すぎて警告でてますが無視します。
$ python manage.py createsuperuser
ユーザー名 (leave blank to use 'hiropy'): hiroyuki
メールアドレス: hogehoge@gmail.com
Password:
Password (again):
このパスワードは メールアドレス と似すぎています。
このパスワードは短すぎます。最低 8 文字以上必要です。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
次は管理ツールで先ほど作ったクラス(モデル)を使えるようにします。
admin.pyの中身を書き換えます。クラスを呼び出して、さらにadminのregisterメソッドを使ってクラスを登録します。
from django.contrib import admin
from .models import Touroku
admin.site.register(Touroku)
ここまできたらブラウザで127.0.0.8000/adminにアクセスします。毎度ですがrunserverしておいてください。
以下のような認証画面がでてきます。
認証して、自身で定義したモデルが入っていればOKです!
あとは適当な名前で登録を行います。テストなのでなんでも。
ここで疑問に思った人がいるかと思います。「ID」っていつ振ったんだろうと。定義しなかったものです。
ここでマイグレーションによって実は生成されてた、app1/migration配下の0001_initial.pyをみてみます。
Migrationというものが作られていて、operationsという変数の中に、テーブルを作るための定義が記述されています。この中のidの部分をみてみるとAutoField(auto_created=Trueと記載されていることから、自動で割り振られていることがわかります。
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Touroku',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=30)),
('gender', models.BooleanField()),
('age', models.IntegerField(default=0)),
],
),
]
と少し話はそれましたが、ユーザーなどの追加に関してもこの管理ツールを使えば簡単に行うことができます。
この後のアプリ本体からDBにアクセスし、情報を表示させることに関しては少し長くなるので、次回の記事に記載していきます。
#この記事はここまで