Open1

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

中井圭輔中井圭輔

Django 初期設定

既にプロジェクトを作成している場合、以下の手順は飛ばしてください

プロジェクトディレクトリの作成

  • 任意のディレクトリにプロジェクトディレクトリを作成する
    $ mkdir orm_test
    $ cd orm_test
    
  • VSCode の場合
    • ここでフォルダーを開くとよい(FileOpen Folderorm_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(フィールド__検索条件)
    
  • 検索条件は検索キーワード=値のような形式で指定する
  • 検索キーワードもたくさんある(参考

参考

【初心者チュートリアル】Django2 でブログ作成(Part6)〜QuerySet(練習編)~

Django データベース操作 についてのまとめ