Django Logo

[Django]Django Rest Framework で Delete メソッドをオーバーライドする

Django Rest Framework で開発するときは基本的に RESTful API で設計・開発を行うのですが、 Delete メソッドを実装した際に削除対象のオブジェクトの削除以外に関連するデータの更新をする必要があり、 Delete メソッドをオーバーライドすることがあったので、実装方法をメモしておきます。
削除対象データとリレーションがあるデータであれば Django のモデル設計時に ForeignKey を設定し、 on_delete の設定により、関連データを削除したり、 Null をセットしたり、デフォルト値を設定したりできますが、リレーションがないデータの更新・削除などを行いたい場合は今回のように Delete メソッドをオーバーライドする必要があります。
例えば売上伝票と明細がある場合に、明細行を削除したら伝票の合計金額を更新するみたいなケースですね。

前提条件

  • Python : 3.8.2
  • Django : 3.0.8
  • djangorestframework : 3.11.0

実装方法

views.py に下記のように実装していきます。

from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework import status as http_status

class SampleViewSet(viewsets.ModelViewSet):
    def destroy(self, request, *args, **kwargs):
        # 削除対象のオブジェクトの取得
        instance = self.get_object()

        # ここでいろいろ処理を行う

        # 削除対象のオブジェクトを削除
        instance.delete()

        # HTTPステータスコード204を返す
        return Response(status=http_status.HTTP_204_NO_CONTENT)

Django Rest Framework で登録・編集時には Serializer クラスで create メソッドや update メソッドをオーバーライドすることで登録・編集処理のカスタマイズが可能ですが、削除時には ViewSet クラスの方で destroy メソッドをオーバーライドすることで削除処理のカスタマイズができます。

最後に

単純な RESTful API であれば Delete メソッドをオーバーライドする必要はないかもしれませんが、どうしても今回のようにカスタマイズが必要な場面は出てくると思います。 Delete メソッドの場合、登録・編集とはオーバーライドを行う箇所が異なるので、実装場所の違いをしっかり覚えておきたいですね。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です