質問: Django rest framework を勉強しています。 主にこのサイトと公式ガイドを参照しました。 views.pyの書き方や継承元クラスはいくつかありますが、 とりあえず自分なりに理解した各方法の特長は以下の感じです ``` ### views `function view` * responseを受け取りResponseを返却する。URLにパラメータを埋め込む場合は引数を増やしたりする * 単純な機能は関数ベースで書いたほうが逆に可読性がよく保守しやすいかも `class view` * APIView クラスを継承して定義する。 対象のHTTPメソッドがそのまま インスタンスメソッド になる。→ハンドラメソッド * 特定のモデルに紐付かないような処理はクラスベースで記述したほうがいい `generic view (汎用ビュー)` * 用意されたいろいろなクラスを継承してつくるビューで、やりたいことを簡単に実装できる * 提供されるメソッドはcreate()、update()、list()など ### viewsets `viewsets.ViewSet` * APIViewを継承していて、permission_classesやauthenticationなどの属性を利用できる * アクションの実装が提供されていないので、クラスをオーバーライドして自分で定義する必要がある * RESTapiに対応するメソッドが提供される。create()、update()、list()など * メソッドの中でquerysetやserializerを指定し、Response()を返す * urls.pyでUserViewSet.as_view()としてメソッドを指定する必要がある? * basename、action、detailなどのインスタンス変数が用意されていて、現在のアクションに基づいて動作を調整できる? `viewsets.ModelViewSet` * GenericAPIViewを継承していて、様々なアクションのための実装を含んでいる * クラス変数としてquerysetとserializer_classを指定する。時々permission_classesも * @actionデコレータを使ってメソッドを定義する。requestを受け取る * self.get_object()やself.get_serializerなどのインスタンスメソッドが用意されている * url^モデル名/{pk}/メソッド名/$でアクションにアクセスできるようになる `viewsets.GenericViewSet` * GenericAPIViewを継承していて、get_object()やget_queryset()などを提供するが、デフォルトではアクションは提供されていない ``` しかし、どういった使い分けをするのかいまいちイメージできないので、**「こんな機能を実装したい場合はこの方法が適している」 のような具体例**をいくつかお願いできないでしょうか 例えば、「画像をpostしたときに、加工してからデータベースに保存する場合はどれがいい」 のような感じです よろしくお願いします
回答: 私は下記のように使い分けています。 `APIView`は、特定の1つのモデルに紐づかない場合に使用します。 `Generic View`は、特定のモデルに対して、リスト、詳細、更新(一部更新)及び削除の機能をうち、1つか2つ程度しか提供しない場合に使用します。 `ModelViewset`は、`Generic View`と異なり、特定のモデルに対して、それら一連の機能を提供したい場合に使用します。 関数ベースドなビューや`GenericViewset`は使用したことがありません。