Open1
Djangoでデータベース操作の練習する

Django 初期設定
既にプロジェクトを作成している場合、以下の手順は飛ばしてください
プロジェクトディレクトリの作成
- 任意のディレクトリにプロジェクトディレクトリを作成する
$ mkdir orm_test $ cd orm_test
- VSCode の場合
- ここでフォルダーを開くとよい(
File
>Open Folder
>orm_test
を選択する) - さらに VSCode のジャンプリストに
orm_test
をピン留めすると便利
- ここでフォルダーを開くとよい(
仮想環境の作成
-
仮想環境をつくる。(仮想環境名)には任意の名前を入力する。ここでは
venv
$ python -m venv (仮想環境名)
-
仮想環境を有効化する。有効化されるとコマンドラインの先頭に環境名が表示される。
$ venv/Scripts/activate (venv)$
Django のインストール
(venv)$ pip install django
プロジェクト作成
-
Django プロジェクトを作成する。(プロジェクト名)には任意の名前を入力する。ここでは
config
。(venv)$ django-admin startproject (プロジェクト名) .
起動確認
- 開発用サーバーを起動する。
(venv)$ python manage.py runserver
-
http://localhost:8000/
にアクセスし、ロケット打ち上げのページが表示されたら完了。
アプリケーション作成
-
アプリケーションを作成する。(アプリ名)には任意の名前を入力する。ここでは
app
。(venv)$ python manage.py startapp (アプリ名)
Django の設定を変更する
orm_test/config/settings.py
を編集する
-
言語設定を変更
LANGUAGE_CODE = 'ja'
-
タイムゾーンを変更
TIME_ZONE = 'Asia/Tokyo'
-
先ほど作成したアプリケーションを登録する
INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "app", # 追加 ]
Model を作成する
-
orm_test/app/models.py
を編集する-
__str__
はオブジェクトを指定した文字列形式にして返すメソッド。必須ではないが、動作確認しやすくなる
from django.db import models class Person(models.Model): name = models.CharField(max_length=32) age = models.IntegerField(default=20) gender = models.BooleanField() def __str__(self): return f"{self.name}({self.age}・{'女'if self.gender else '男'})"
-
migration を行う
(venv)$ python manage.py makemigrations
(venv)$ python manage.py migrate
シェルを開く
テンプレートで表示しようかと思ったが、手間がかかるのでシェルにて練習する
shell を開くと>>>
が出てくる
(venv)$ python manage.py shell
>>>
モデルを読み込んで準備完了
>>> from app.models import Person
データベースを操作する
データベースを操作するメソッド
基本構文
モデルクラス.objects.メソッド()
- いろいろなメソッドをくっつけることで、データの作成・読み出し・更新・削除を行うことができる
- 以下によく使うものを挙げるが、他にもたくさんある(参考)
レコードを作成
create()
を使う
>>> Person.objects.create(name="Tanaka", age=21, gender=False)
<Person: Tanaka(21・男)>
後で使うので、さらにレコードを作成する
>>> Person.objects.create(name="Yamada", age=30, gender=True)
<Person: Yamada(30・女)>
>>> Person.objects.create(name="Suzuki", age=40, gender=False)
<Person: Suzuki(40・男)>
>>> Person.objects.create(name="Fujiwara", age=50, gender=True)
<Person: Fujiwara(50・女)>
>>> Person.objects.create(name="Teshigawara", age=60, gender=False)
<Person: Teshigawara(60・男)>
レコードを全件取得
all()
を使う
>>> Person.objects.all()
<QuerySet [<Person: Tanaka(20・男)>, <Person: Yamada(30・女)>, <Person: Suzuki(40・男)>, <Person: Fujiwara(50・女)>, <Person: Teshigawara(60・男)>]>
レコードを検索
filter()
を使う
>>> Person.objects.filter(name="Teshigawara") # 名前が「Teshigawara」
<QuerySet [<Person: Teshigawara(60・男)>]>
>>> Person.objects.filter(gender=True) # 女性
<QuerySet [<Person: Yamada(30・女)>, <Person: Fujiwara(50・女)>]>
特定のレコードを除外する
exclude()
を使う
>>> Person.objects.exclude(gender=True) # 女性以外
<QuerySet [<Person: Tanaka(20・男)>, <Person: Suzuki(40・男)>, <Person: Teshigawara(60・男)>]>
レコードを並べ替える
order_by()
を使う
>>> Person.objects.order_by("name") # 名前順(たぶんアルファベット順)
<QuerySet [<Person: Fujiwara(50・女)>, <Person: Suzuki(40・男)>, <Person: Tanaka(20・男)>, <Person: Teshigawara(60・男)>, <Person: Yamada(30・女)>]>
>>> Person.objects.order_by("age") # 年齢順
<QuerySet [<Person: Tanaka(20・男)>, <Person: Yamada(30・女)>, <Person: Suzuki(40・男)>, <Person: Fujiwara(50・女)>, <Person: Teshigawara(60・男)>]>
レコードを変更
-
方法 1:
update()
を使う>>> Person.objects.filter(name="Suzuki") # 確認 <QuerySet [<Person: Suzuki(40・男)>]> >>> Person.objects.filter(name="Suzuki").update(age=41) # 年齢を変更 1 >>> Person.objects.filter(name="Suzuki") # 年齢が変わった <QuerySet [<Person: Suzuki(41・男)>]>
-
方法 2:インスタンスの変数の値を変えて、
save()
>>> tanaka = Person.objects.filter(name="Tanaka") >>> tanaka.age = 20 >>> tanaka.save() >>> tanaka <Person: Tanaka(20・男)>
レコードを削除
delete()
を使う
>>> Person.objects.filter(name="Tanaka").delete() # Tanaka を消去
(1, {'app.Person': 1})
>>> Person.objects.all()
<QuerySet [<Person: Yamada(30・女)>, <Person: Suzuki(40・男)>, <Person: Fujiwara(50・女)>, <Person: Teshigawara(60・男)>]> # Tanaka が消えた
Field Lookups
-
filter()
、get()
、exclude()
ではField Lookups
という検索条件を指定することで、より細かい検索が可能となる - 基本構文
モデルクラス.objects.filter(フィールド__検索条件)
- 検索条件は
検索キーワード=値
のような形式で指定する - 検索キーワードもたくさんある(参考)