LoginSignup
6
10

More than 5 years have passed since last update.

[Python]とにかくわかりやすく!Djangoでアプリ開発!ーその5ー

Last updated at Posted at 2019-02-11

前回の記事

前回の記事→とにかくわかりやすく!Djangoでアプリ開発!ーその4ー
上記の記事までのまとめ→[Python]とにかくわかりやすく!Djangoでアプリ開発!ー中間まとめ[1-4]ー

※前回までの記事、おかげさまでユーザーランキング7位までいきました。ありがとうございます。
IMG_6992.jpg

本記事の目的

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を使うことが多いので以下の設定にすることもあります。

settings.py
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で{{}}で埋め込めます。

models.py
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しておいてください。

以下のような認証画面がでてきます。

スクリーンショット 2019-02-11 19.03.19.png

認証して、自身で定義したモデルが入っていればOKです!

スクリーンショット 2019-02-11 19.05.33.png

あとは適当な名前で登録を行います。テストなのでなんでも。

スクリーンショット 2019-02-11 19.13.29.png

ここで疑問に思った人がいるかと思います。「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にアクセスし、情報を表示させることに関しては少し長くなるので、次回の記事に記載していきます。

この記事はここまで

続きはこちら→[Python]とにかくわかりやすく!Djangoでアプリ開発!ーその6ー

6
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
10