Django API ViewsetとForeginKeyの使い方

必要な環境

・Python 3

・pip

・git(※無くても良い)

イントロ

前回はPythonのフレームワークDjangoとDjango Rest Frameworkを使ってクラスベースとファンクションベースのView(views.py)でAPIを作りました。

前回カバーしたのはHTTPのGETリクエストに対してのレスポンスとしてデータを出力しただけです。

まずは、主なHTTPのリクエストを簡単に紹介します。

GETリクエスト➡データ取得

POSTリクエスト➡フォームのサブミット、ログイン、記事の投稿など

PUT➡データの更新、書き換え

DELETE➡既存のデータの削除

詳しくはこちらを参考にしてください。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods

では、前回やったAPIViewでも同じようにそれぞれのHTTPでリクエストが来たときにどうやってDjango側がリクエストを扱うかコードで指示できます。

詳しくはこちらを参照。

https://www.django-rest-framework.org/api-guide/views/

しかし、DjangoのREST Frameworkでviewsetという全部のリクエストをカバーしたメソッドがあるのでそれを今日紹介していきます。

環境の設定

まずは下記のGitHubリポジトリからコードをダウンロードしてください。

https://github.com/TraitOtaku/djangoAPI.git

Gitを使ったことがない人はZIPファイルでもダンロードできます。

ではGitのコマンドです。

cdでファイルを作成したい所に行き、

git clone -b 2_Viewset https://github.com/TraitOtaku/djangoAPI.git

で、virtualenvが入っていない人はグローバルに入れます。

pip install virtualenv
virutalenv ENV

ENV\Scripts\activate.bat

(ENV)でアクティベートされていることを確認して、requirements.txtnのパッケージを全部インストールします。

pip install -r requirements.txt

pip list
python manage.py makemigrations

python manage.py migrate

​​​​​​​python manage.py createsuperuser

VSCodeを使っている人はこれでテキストエディタを開きましょう。

code .

python manage.py runserver

コンセプトの紹介

まずは、今日使用するアプリの例を紹介します。例として、コールセンターをイメージしましょう。

この画像のように、Djangoで3つアプリを別々に作成しました。

1.会社で従業員を管理するmembers app

2.顧客を管理するcustomers app

3.顧客からの問い合わせを管理するTicket app

Djangoの良いところはこのアプリを連携されてスケーリングが簡単にできることです。

ではこのアプリがどのように連携されるかデータベースのモデルを見てみましょう。

モデルの理解

members.models.py

従業員のデータモデルです。

Customers.models.py

顧客情報のモデルです。

Tickets.models.py

チケットのモデルです。

ForeignKeyで他のモデルのデータを参照していることに注目してください。

アドミンパネルでサンプルデータを作成

ではアドミンパネルで適当にデータを作成します。

データベースの中身を見る

では、DB Browserという無料のソフトウェアを使ってデータベースの中身を見てみましょう。

TicketのテーブルのForeignKeyで他のテーブルのIDを参照していることに注目してください。

ツールはここからダウンロードできます。

https://sqlitebrowser.org/

Serializerを見る

特に重要なのがこのForeingKeyをどうやってAPIで出力するかです。

もし、Readオンリーであればソース源をそのまま出力できますが、

CRUDオペレーションをしたい場合、(データの作成、読み込み、更新、削除)ちょっとした工夫が必要になりそうです。

Views.pyを見る

ここで今日の本題のviewsetの紹介に入ります。ViewsetはこのCRUDで使うAPIを全部セットで使えるようになった便利なメソッドの事です。これを使うことでいちいちGET、PUT、DELETE、POSTのコードを書かなくても良いようにあります。

もちろん、カスタマイズが必要な場日は、コードを上書きすることもできます。

では、viewsetを見てみます。

今回のアプリでは、membersとcustomersは会社のマネージャーがDjangoのアドミンパネル(サーバー側)から編集すると考えます。

それで、従業員がブラウザ上でチケットを管理するような流れです。

なので、membersとcustomersのデーターはReadOnlyModelViewSetはGETメソッドだけ用に絞ってクライアント側ではリードオンリーのデータした提供されません。

Router.pyを見る

今までのDjangoアプリはurls.pyでURLをそれぞれのアプリから提供していました。APIもこのやり方でも良いのですが、どんどなプリが増えてくるとどのURL(URI)がAPI化されているか煩雑になります。

そこで、プロジェクト側のディレクトリにrouter.pyファイルを作成してAPIのエンドポイントを一つにまとめます。このファイルはプロジェクト側のurls.pyから呼び出されていることを忘れずに。

APIを見てみよう。

では実際に提供されたAPIでCRUD操作ができるか試してみましょう。

次回

では、これで、従業員がAPIを使ってブラウザ側からDjangoアプリにデータをやり取りすることができました。しかし、このままだとAPIが垂れ流しでURL(URI)にアクセスで切る人が誰でもデータをみたり編集できてしましますね。

ですので次回はAuthentication(認証、ログイン)システムを使ってAPIのセキュリティ強化をしてみたいと思います。

ではお疲れさまでした。