プログラミング

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

プログラミング
この記事は約3分で読めます。
スポンサーリンク

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メソッドの場合、登録・編集とはオーバーライドを行う箇所が異なるので、実装場所の違いをしっかり覚えておきたいですね。

スポンサーリンク
スポンサーリンク
KoEをフォローする
CodeLab

コメント

タイトルとURLをコピーしました