[python] DJangoでAPI的なものを作る その3 取得部分を作る

前回でmodels(DB)ができあがったので、今回は実際にURLでアクセスして結果を取ってくるあたりを作ってみようかと思います。

実際に取得する部分を作るには、 urls.py と、 view.py と、serializers.py という3つのファイルを編集します。
serializers.py は、デフォルトでは作成されていないので、pollsフォルダに自分で作成します。
それぞれの役目は、
urls.py
URLで指定たパスで、どのコマンドを実行するかを紐付けする場所
ここで、URLのパスというか、ドメイン以下の名前で何を実行するかを指定しています。
デフォルトだと

こんな感じのものが書かれています。
これは、http://localhost/admin と打ち込まれたら、admin.siteurls の内容を表示しろ(前回の管理画面の事)という指示が書かれています。

view.py
この中には、urls.py が呼ばれたときに実行するコマンドを実際に書きます。
serializers.py
シリアライズということばをググってみると

シリアライズとは、ソフトウェア内部で扱っているデータを丸ごと、
ファイルで保存したりネットワークで送受信することができるように変換すること。

という感じなので、たぶんPOSTなりGETなりで受け取ったデータをイイカンジに処理してmodelsに渡したり、受け取ったりする処理部分を書くところかなと脳内で把握しました。

まず、今回はrestframeworks というAPIを作るのを簡単にしてくれるモジュールを使用するので
settings.pyに使えるようにするための記述を追加します。

INSTLALLED_APPSに rest_framework を追加して、REST_FRAME_WORKSの設定用の変数を定義します。

次に、urls.pyにアクセスするURLの設定を追加します。
今回は、views.pyにTaskGetというクラスを作成してそいつを呼びに行くようにします。

まずはお試しでこんな感じで helloを返すクラスを作って見ました。
APIViewは get と post という関数をオーバーライドすることで、GETで取得・POSTで取得したときの挙動を作成することができます。
今回はURLに渡す数値もない(少ない)のでGETで作成します。

実際に結果として返したい値は、Response()という専用の関数を通してreturnします。

python manage.py runserver でサーバーを起動して、 http://localhost:8000/api/get にアクセスすると、

getView

restframeworksがイイカンジに処理して、GETした結果をおされな画面で表示してくれます。
これでURL→処理の結果を返す まで出来ました。
次は具体的にDBから値を取ってくるようにしてみます。

pollsフォルダに作成した serializers.py を、下のようにします。

serializers.Serializer クラスを継承したクラスを作成します。
今回ので初めてクラスのクラス(わけがわからないよ)が使えることを知りました(汗
とりあえず、 class Meta: 内に、取得したいmodelをセットするのと
取得したいフィールドを書きます。
さらに、クラスの変数として取得したいフィールドを書いてあげます。

CharFieldの所はmodelsと共通だったのでさして迷うこともなかったのですがForeignKeyで指定した場合の結果を取得するにはどうしたら良いのか全く分からずに
調べている最中はかなり苦労しました。
とりあえず色々とやり方はありますが(Status用のSerializerを書くとか)、今のところはSerializerMethodFieldを使用するやり方が一番しっくりきました。
これは、引数で指定した名前のクラス関数を呼び出してその返値がAPIに出力されるというものです。
サンプルの場合は、instanceとしてTaskオブジェクトが渡されます。
そのstatusの中身(文字)を取る場合は
status.status(ForeignKeyは、modelsの名前.(ドット)外部キーの名前 で取得できます

views.pyを、上のように書き直し。
URLでアクセスがあると、まず全タスクが取得して、そのタスクをserializerに渡します。
serializerが、modelsから必要な情報を取得して、外部キーので指定してるものを処理したりしてJsonに加工してviews.pyに結果を返して、views.pyが最終的な結果としてJSON形式の文字列として返してくれます。

getView2

ここまでできたら、再度サーバーにアクセスしてみると
登録した情報が取得できました。

単純な取得だったりは数時間で出来たのですが、ForeignKeyが絡んできた当たりからは
restframeworkを使用した場合の日本語サンプルが見つからず理解するまでだいぶ時間がかかりました。
やっぱり英語の読解力をもうちょっと上げないと今後は厳しいですね(汗

次回、登録につづく!!

おまけ。

SerializerMethodField を使用せずに、Serializerを定義して作った場合

これでもOKなのですが(登録時はこれじゃなきゃうまく行かなかったがそのへんは次回)
その場合は、

addTask_C

こんな感じで status の部分がDictになってしまい微妙な感じになってしまいます。
ForeignKeyまわりを取得するには色々とFieldがあるものの
読み込みはOKだけど書き込みするときにread_onlyでアウトだったりして
なかなか良いやり方が見つからず…いいやり方あったら教えてください

 

コメントを残す

メールアドレスが公開されることはありません。


*