Django REST FrameworkのViewSet、特にModelViewSetで自動的に提供しているlist, retrieve, create, update, partial_update, destroyなどのCRUDアクションの種類を整理します。
参考:公式ドキュメントViewSet actions
create
- HTTPリクエスト: POST
- 役割: 新しいレコードを作成します。通常、POSTリクエストを処理し、新しいインスタンスをデータベースに保存します。新規登録によく使われます。
def create(self, request, *args, **kwargs)
list
- HTTPリクエスト: GET (複数のオブジェクト)
- 役割: 全てのレコード、またはフィルタされたレコードのリストを取得します。通常は/api/resource/のようなリクエストに対応します。〇〇一覧とかのページを作るときに◎
def list(self, request, *args, **kwargs)
retrieve
- HTTPリクエスト: GET (単一のオブジェクト)
- 役割: 特定の1つのレコードを取得します。/api/resource//のようなリクエストで、特定のpkに基づいてデータを取得します。詳細ページの表示とかに使います。
def retrieve(self, request, *args, **kwargs)
partial_update
- HTTPリクエスト: PATCH
- 役割: 特定のレコードを部分的に更新します。PATCHリクエストで送信されたフィールドのみを更新します。レコードのある特定のカラム(フィールド)だけ変更を加えたいという時に使います。フラグ変更、論理削除とかに使ったことがあります。
def partial_update(self, request, *args, **kwargs)
destroy
- HTTPリクエスト: DELETE
- 役割: 特定のレコードを削除します。通常、/api/resource//のように特定のpkに対してDELETEリクエストを送信すると、そのリソースが削除されます。要は物理削除です。レコードを完全に消したい時に使います。
def destroy(self, request, *args, **kwargs)
update
- HTTPリクエスト: PUT
- 役割: 特定のレコードを完全に更新します。リクエストで送信された全フィールドで既存のリソースを置き換えます。レコードの全てのカラム(フィールド)に更新をかけたい時に使います。
def update(self, request, *args, **kwargs):
update と partial_update の違い
両者の違いは、特定のレコードのカラム(フィールド)の一部変更か、もしくは全カラム(フィールド)変更かという違いです。
- update: 一般的にはPUTリクエストに対応し、クライアントから全フィールドの値を送ることを期待します。欠けたフィールドはデフォルト値やnullで上書きされることが多いため、全フィールドの更新が前提です。
- partial_update: PATCHリクエストに対応し、送信された一部のフィールドだけを更新します。未送信のフィールドは変更されず、元の値が保持されます。
しかし、pertial_updateで全カラム(フィールド)の変更情報を送っても変更はできてしまいます。
また、updateメソッドでも全レコードの変更内容を送らず、PATCHに対応させるように書く方法もあります。
そのため、両者の違いがよくわからないですが、私は部分更新(フィールドの一部変更)が主流であれば、pertial_updateというふうに書いてみています。