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