Django Rest Frameworkを学ぼう! ~@api_viewついて~

前回は、シリアライズについて学びました。

本日は、Django Rest FrameworkのAPI View(@api_view)について学びます。

前回

API Viewについて

前回は、Serializerクラスを通じて、シリアライズ/デシリアライズのやり方をみてきました。

今回、Django REST FrameworkのAPI Viewを使ってシリアライズ/デシリアライズされたデータの受け渡し方法をみていきましょう。

API Viewを使うために、Django REST Frameworkでは、2つのラッパーを提供しています。

  • @api_viewデコレータ – 関数ベースのAPI View
  • ApiViewクラス – クラスベースのAPI View

本記事では、@api_viewについて扱います。

ファイルの準備

API Viewの処理を書き出すファイルを準備しましょう。

Article Listの実装 ~@api_view~

@api_viewデコレータを使って、Article Listを実装します。

Viewの設定 – GET編

ユーザーリクエストをさばくAPI VIewを実装します。

上記ではGETリクエストされた時に、DBに保存されている全てのArticleデータを取得し、そのデータをシリアライズ後、リクエスト元に返却しています。

また、データを取得する条件として、Articleが有効(active=True)なデータを取得しています。

URLディスパッチャ

リクエスト先のURLを実装します。

まずは、newsアプリ配下のurls.pyに以下の実装をしてください。

「XXXX/articles」にリクエストを送った時に、article_list_create_api_viewへ処理依頼をするように実装しました。

次に、selfnote_api配下のurls.pyも変更してください。

これで、「localhost:8000/api/articles」にアクセスすれば、DBに保存されたArticleの一覧が表示できるはずです。

動作確認 – GET編

開発サーバーを起動します。

localhost:8000/api/articles」にアクセスしましょう。

OKですね。

many=Trueオプションについて

補足ですが、ArticleSerializerの「many=True」オプションを外すと、以下のようになります。

AttributeError: Got AttributeError when attempting to get a value for field author on serializer ArticleSerializer.
The serializer field might be named incorrectly and not match any attribute or key on the QuerySet instance.
Original exception text was: ‘QuerySet’ object has no attribute ‘author’.

これはデータの渡し方に問題があります。

もともとArticleSerializerクラスには「単一のデータ」しか渡せません。

しかし、以下のようにfilterメソッドを使ってデータを取得するとリスト形式でデータが返却されてしまいます。

リスト形式など”複数のデータをシリアライズクラスに渡したい“場合は、many=Trueオプションをつけましょう。

ちなみに、以下のようにすれば、エラーは発生しませんでした。

Viewの設定 – POST編

続いて、POSTを実装します。

POSTでは、リクエスト時に受け取ったデータの検証を行なった後、DB登録する処理を書いています。

ちなみに、saveメソッドを呼ぶとArticleSerializerクラスに実装されているcreate関数が自動的に呼び出されるようになっています。

動作確認 – POST編

ブラウザをリダイレクトすると以下のフォームが表示されると思います。

ContentにJSON形式のデータを入れて、DBに登録されるか確認してみましょう。

OKですね。

Article Detailの実装 ~ @api_view~

Article Listの実装が完了したので、今度はArticleの詳細を表示するAPI Viewを実装しましょう。

Viewの設定

今回は、GET, PUT, DELETEメソッドを使います。

GETでは、指定したID(pk)の記事を取得し、PUTでは記事の更新、DELETEでは記事の削除をそれぞれ担当します。

article_detail_api_view関数の引数に指定しているpkは、ArticleのIDを示しており、URLディスパッチャ(次に設定する)のpkをここで受け取ることができます。

URLディスパッチャ

“article/<int:pk>”のpkと、article_detail_api_view (request, pk)のpkの文字列は完全一致でなければなりません。

動作確認

動作確認をしてみましょう。

先ほど、id(pk)が4のArticleを作成したので、以下のURLにアクセスします。

http://localhost:8000/api/articles/4

無事に詳細ページが表示されました。

記事の更新をしてみましょう。Content欄にアップデートしたいデータを書き込んで、PUTボタンを押下します。

更新前
更新後

無事に更新されましたね。

最後に、ページ上部のDELETEボタンを押下して、削除機能を試してみましょう。

DELETEも問題ないですね。

次回

次回は、もう一つのAPI ViewラッパーであるAPI Viewクラスについて学んでいきましょう!

関連

こちらもどうぞ

Djangoおすすめ書籍

Djangoを学ぶなら以下の書籍がオススメです。

緑 -> 赤 -> 紫の順でやればOKです。読みやすい英語で書かれているので、英語力もついでに上がるかもしれません^^

コメントを残す