質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3338閲覧

Django rest framework におけるviews.py の書き分け

SATSUKI.

総合スコア21

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/08/22 06:50

編集2020/08/22 08:22

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したときに、加工してからデータベースに保存する場合はどれがいい」 のような感じです

よろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

私は下記のように使い分けています。

APIViewは、特定の1つのモデルに紐づかない場合に使用します。

Generic Viewは、特定のモデルに対して、リスト、詳細、更新(一部更新)及び削除の機能をうち、1つか2つ程度しか提供しない場合に使用します。

ModelViewsetは、Generic Viewと異なり、特定のモデルに対して、それら一連の機能を提供したい場合に使用します。

関数ベースドなビューやGenericViewsetは使用したことがありません。

投稿2020/08/22 10:30

hasami

総合スコア1277

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SATSUKI.

2020/08/23 10:26

ご回答ありがとうございます 普通のViewSetはどういった場面で使われますか?
hasami

2020/08/23 15:17

使った事がないため、他の方でお願いいたします。 目的と手段、自分が理解できる範囲で選べばいいと思います。
SATSUKI.

2020/08/24 10:30 編集

ViewSetを使わなくてもある程度の機能は実現できるということですね hasamiさんの使い方としては以下であってますでしょうか? 特定のモデルに紐づかない━CURD操作を少しだけ使いたい ━→ APIView 特定のモデルに紐づかない━CURD操作を全て使いたい ━→ APIView 特定のモデルに紐づく━CURD操作を少しだけ使いたい ━→ GenericView 特定のモデルに紐づく━CURD操作を全て使いたい ━→ ModelViewSet
hasami

2020/08/24 11:48

そのような感じですが、APIViewの使用は、複数の異なるモデルのインスタンスの参照か、システム状態提供などモデルに全く関係ない場合に限定されることが多いです。
SATSUKI.

2020/08/26 05:58

なるほど、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問