Django データベースアクセス方法まとめ

Djangoはデータベースにアクセスする際、ORM(オブジェクト関係マッピング)という技法が用意されており、それを使用してアクセスすることとなります。
SQLを知らなくてもデータベースへの操作が可能ですが、この技法を知る必要があります。

Djangoでデータベースへアクセスする手法を紹介します。

前提条件

テーブルの構造は次のようなデータを扱う事を想定します。

models.py

class MemberList(models.Model):
    name = models.CharField(max_length=20)
    sex = models.CharField(max_length=1)
    age = models.IntegerField()
    blood = models.CharField(max_length=2)
    birthplace = models.CharField(max_length=20)

Django (insert)レコードの追加

次のようにします。

MemberList(name="平本弘明", sex="男", age="30", tel="012345678", birthplace="奈良県").save()

Django (insert)レコード追加が成功した場合のidを取得したい

データ追加後、すぐに主キーであるidを取得したい場合があると思います。
その場合は次のようにします。

ml = MemberList(name="福井秀幸", sex="男", age="26", tel="012345678", birthplace="北海道")
ml.save()

if ml is not None:
    print(ml.id)
# 2

追加データを一度変数に格納して保存処理を行い、その変数からidを参照することで実現できます。

Django (select)情報の取得 単一データ[get]

次のようにします。

ml = MemberList.objects.get(pk=2)

pkとは主キー(primary key)のことで、例では2を指定して取得しています。
主キー以外にも指定可能ですが、データが存在しない場合や複数取得してしまう場合はエラーとなってしまうのであまり使い勝手がよくありません。

Django objects.get のエラー対策

objects.getは次のような場合エラーが発生します。

・指定条件でデータが存在しない場合
・指定条件で2つ以上の複数のデータが存在する場合

このエラーでブラウザもエラー画面となってしまいます。
これを回避するためには次のようにtry構文で囲みます。

try:
    ml = MemberList.objects.get(pk=id)
except:
    ml = None

Django (select)情報の全取得[all]

mls = MemberList.objects.all()

取得データ型はリスト形式です。一つしか取得できなくても同様です。
中身の確認は次のようにする必要があります。

for ml in mls:
    ml.name

または

mls[0].name

など

Django (select)情報の取得 複数データ[filter]

条件を指定して取得する方法です。
取得データ型はリスト形式となります。

Django filter – 条件指定[完全一致]

mls = MemberList.objects.filter(blood="B")

Django filter – 複数条件指定[完全一致]

mls = MemberList.objects.filter(blood="B", sex="男")

カンマで区切ることで複数の条件を指定できます。

Django filter – 条件指定[含む]

mls = MemberList.objects.filter(name__contains="森田")

Django filter – 先頭のみ取得

取得データの先頭のみのデータを取得します。
取得できるデータは一つのみなので、データ型はmodel型です。

ml = MemberList.objects.filter(blood="B").first()

取得できるデータが確実に一つだけの場合、リスト形式なのは面倒ならばこのようにしてもいいでしょう。

Django (update)情報の更新

一度変更対象のレコードを取得し、変更したい部分を編集して保存する方法が一般的です。

ml = MemberList.objects.get(pk=2)
ml.birthplace = "東京都"
ml.save()

Django (delete)情報の削除

条件指定削除

MemberList.objects.get(pk=2).delete()
MemberList.objects.filter(blood="B").delete()

全権削除

MemberList.objects.all().delete()

Django order_byで順番を並び替え

# asc
MemberList.objects.all().order_by("age")
# desc
MemberList.objects.all().order_by("-age")

コメント