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

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

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

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Q&A

解決済

1回答

1971閲覧

Django REST framework モデルをserializeした後にデータを加工し、加工後のデータをレスポンスしたい

_Victorique__

総合スコア1392

Django

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

0グッド

0クリップ

投稿2019/01/15 07:15

djangoとrest_frameworkを用いてapiを作成しております。

api作成の手順として

modelの定義

serializerの定義

viewsetの定義

api_urlのルーティング

 
だと思うのですが、データベースのデータをそのまま渡すのではなく、データを使って何かしらの処理をした後のデータをレスポンスとして与えたいと考えております。seriarizerもしくはviewsetに記述するとは思うのですが、加工した後のデータをどうやって再度シリアライズすればいいのかが分かりません。
全く的外れなことを言っているかもしれません。
これを実現するにはどうすれば良いでしょうか?また、実現しようとしていることが好ましくない場合はどのような対応をすれば良いでしょうか?

python

1# viewset 2class TaskViewSet(ReadOnlyModelViewSet): 3 queryset = Task.objects.all() 4 # 例えば取得したquerysetの統計情報を計算してそれをresponseに与えたい 5 # クライアント側ですべきか? 6 serializer_class = TaskSerializer

Python

1# serializer 2class TaskSerializer(serializers.ModelSerializer): 3 class Meta: 4 model = Task 5 fields = ( 6 'id', 7 'uid', 8 'date', 9 'task', 10 )

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

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

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

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

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

guest

回答1

0

ベストアンサー

querysetの統計情報が具体的にどういうものかわかりませんが、単純にTaskSerializerにデータを加えたいのであれば、Serializer に SerializerMethodField を生やして任意のデータを加えるという手はあると思います。

python

1 2# serializer 3class TaskSerializer(serializers.ModelSerializer): 4 class Meta: 5 model = Task 6 fields = ( 7 'id', 8 'uid', 9 'date', 10 'task', 11 'toukei_data', 12 ) 13 14 toukei_data = serializers.SerializerMethodField() 15 16 def get_toukei_data(self, obj): 17 return # 好きなデータを返すと、JSON の toukei_data にデータが加わる 18

参考: https://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

他にやりようがあるとすれば、例えば、ViewSet の listメソッド を overrideしてレスポンス内容を書き換えるとかも可能だとは思います。

参考: https://www.django-rest-framework.org/api-guide/viewsets/#modelviewset

投稿2019/01/15 09:22

tell_k

総合スコア2120

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

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

_Victorique__

2019/01/15 09:54

回答有難うございます。 なるほどget_*()を実装することでfieldに*を追加することができるのですね。 ということは、fieldにその他を書かなければ追加したものだけレスポンスとして与えられるという認識で合っていますでしょうか?
tell_k

2019/01/15 09:56

その認識であってると思います。
_Victorique__

2019/01/15 10:03

あーもしかして、serializerでは全て記述しておいて、viewsetでdjango_filterを用いてフィルタリングするような使い方が一般的でしょうか?
tell_k

2019/01/15 10:06

django_filter はデータの検索条件を指定するやつなので、今回のように追加でデータを加えたいみたいなケースには使えないと思いますね。例) GETパラメータで hoge=1 渡したら、テーブルのなかから hoge==1のデータだけをfilterする。
_Victorique__

2019/01/15 10:12

ほんとですね。 では用途に合わせたserializerを作らないといけないということで合ってますか?
tell_k

2019/01/15 10:15

はい。Modelに存在しないデータはSerializerで別途付与してあげるのが良いと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問