【Django】データベースのデータ(フィールド)を更新する3つの方法

時計 2022.03.13 / 時計

【Django】データベースのデータ(フィールド)を更新する3つの方法

本記事ではDjangoにおける、データベースのデータ(フィールド)を更新する方法について解説していきます。

本記事では私がよく利用する以下3つの方法を紹介していきます。

  • フィールドのデータ一つ一つを更新していく
  • update_or_create()の利用
  • フォームを利用した更新

Webアプリケーションではデータベース操作は必須の知識です。データベースの基本操作の一つ、データ更新の方法を本記事を通して確認してください。

データベースにデータを追加する方法については以下記事をご参照ください。

Djangoにおけるデータベース操作

Djangoでデータベース操作(追加・更新・削除など)を実行するためにはORM(Object-Relational Mapping)という技法を使います。

models.pyのクラスから生成したオブジェクトとデータベースを関連付けて(マッピング)データベースを操作するということです。

データベースのデータ更新においても、もちろんORMを利用します。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'},
)

フォームを利用した更新

テンプレートのフォームから送信されたデータをデータベースに更新する場合、フォームクラスを利用すると簡単にデータ更新ができます。

フォームクラスについては以下記事をご参照ください。

テンプレートからフォームクラスを利用した更新情報をデータベースに反映させる場合、フォームクラスの引数に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】データベースのデータ(フィールド)を更新する3つの方法」はいかがでしたか。

本サイトOFFICE54ではDjangoによるWebアプリケーション開発に必要な様々な知識・技術を解説しています。

ぜひ他の記事にも目を通してみてください。