【Django】データベースのデータ(フィールド)を更新する3つの方法
2022.03.13 /
本記事ではDjangoにおける、データベースのデータ(フィールド)を更新する方法について解説していきます。
本記事では私がよく利用する以下3つの方法を紹介していきます。
- フィールドのデータ一つ一つを更新していく
- update_or_create()の利用
- フォームを利用した更新
Webアプリケーションではデータベース操作は必須の知識です。データベースの基本操作の一つ、データ更新の方法を本記事を通して確認してください。
データベースにデータを追加する方法については以下記事をご参照ください。
【Django】データベース操作:データを新規で追加する方法(create()とsave()の違い)
Djangoにおけるデータベース操作
Djangoでデータベース操作(追加・更新・削除など)を実行するためにはORM(Object-Relational Mapping)という技法を使います。
models.pyのクラスから生成したオブジェクトとデータベースを関連付けて(マッピング)データベースを操作するということです。
データベースのデータ更新においても、もちろんORMを利用します。ORMについて詳しくは以下記事をご参照ください。
【Django】データベース操作(取得・作成・更新・削除):ORMの利用
フィールドのデータ一つ一つを更新していく
データベースのデータを更新する方法の一つに、データのオブジェクトを取得して、そのフィールド1つ1つを直接更新していく方法があります。
データベースから目的のデータ(オブジェクト)を1つ取得する必要があるため、get()メソッドを利用します。取得したオブジェクトから各フィールドの値を更新していきます。
以下に使用例を記します。ここではモデルBookingのstatusとpersonフィールドを更新しています。
def update(request, pk):
if request.method == "POST":
booking = Booking.objects.get(pk=pk)
booking.status = request.POST.get("status")
booking.person = request.POST.get("person")
booking.save()
すべてのフィールドを更新したら、必ずsave()メソッドを呼び出して、データベースへの反映を忘れないようにしましょう。
この方法は更新するフィールドが多くなると、コードの行数が多くなってしまう欠点があります。
update_or_create()の利用
データベースのデータ更新はQuerySetメソッドのupdate_or_create()メソッドを利用して実現することもできます。
update_or_create()メソッドはすでにテーブルに該当のデータがあれば更新を行い、なければ新規で追加するメソッドです。
update_or_create(defaults=None, **kwargs)
kwargsにはデータを特定するためのキーを指定し、defaultsにはフィールドと値の辞書形式で更新したい値を指定します。
以下views.pyで使用例を記します。ここではBookingモデルのstatusとpersonフィールドの更新を行っています。
def update(request, pk):
if request.method == "POST":
Booking.objects.update_or_create(pk=pk, defaults={"status":status, "person":person})
重要な点は、更新するデータを特定するためのキーはupdate_or_createの引数内にイコールの形で指定し、更新する値はdefaults内に辞書形式で指定することです。
update_or_create()で返される値は(object, created)のタプル型です。Objectには更新または新規作成されたオブジェクトが格納され、createdにはオブジェクトが追加されたかどうかの結果(TrueまたはFalse)が格納されます。
公式サイトでは以下のようなコード例が記されています。
defaults = {'first_name': 'Bob'}
try:
obj = Person.objects.get(first_name='John', last_name='Lennon')
for key, value in defaults.items():
setattr(obj, key, value)
obj.save()
except Person.DoesNotExist:
new_values = {'first_name': 'John', 'last_name': 'Lennon'}
new_values.update(defaults)
obj = Person(**new_values)
obj.save()
上記コードをupdate_or_create()を使って表現すると以下のように短く記入できます。
obj, created = Person.objects.update_or_create(
first_name='John', last_name='Lennon',
defaults={'first_name': 'Bob'},
)
フォームを利用した更新
テンプレートのフォームから送信されたデータをデータベースに更新する場合、フォームクラスを利用すると簡単にデータ更新ができます。
フォームクラスについては以下記事をご参照ください。
【Django】forms.py:モデルを利用したフォームの作成方法(forms.ModelForm)
テンプレートからフォームクラスを利用した更新情報をデータベースに反映させる場合、フォームクラスの引数にrequest.POSTとinstance変数を利用します。
member = get_object_or_404(Member, pk=member_id)
if request.method == "POST":
form = MemberForm(request.POST, instance=member)
if form.is_valid():
form.save()
このようにしてsave()することで、更新処理としてデータベースに反映されます。
フォームクラスを利用したデータの追加や更新については以下記事をご参照ください。
【Django】フォームForm:データベースへの新規登録・更新機能を組み込む(instance変数)
まとめ
本記事「【Django】データベースのデータ(フィールド)を更新する3つの方法」はいかがでしたか。
本サイトOFFICE54ではDjangoによるWebアプリケーション開発に必要な様々な知識・技術を解説しています。
ぜひ他の記事にも目を通してみてください。