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")
コメント