[解決済み] Django REST フレームワーク: 非モデルシリアライザー
質問
Django RESTフレームワークの初心者ですが、アドバイスをお願いします。私はウェブサービスを開発しています。このサービスは、他のサービスにRESTインタフェースを提供する必要があります。私が実装する必要があるRESTインターフェースは、私のモデルで直接動作しません(私は、取得、配置、投稿、削除の操作を意味します)。その代わり、他のサービスに計算結果を提供します。私のサービスはリクエストに応じて計算を行い、その結果を返すだけです(結果を自身のデータベースに保存しません)。
以下は、そのRESTインターフェースがどのように実装され得るかについての私の理解です。もし間違っていたら、訂正してください。
-
計算を行うクラスを作成します。名前は「CalcClass」とします。CalcClassは、その作業でモデルを使用します。
- 計算に必要なパラメータはコンストラクタに渡されます。
- calc演算を実装する。結果は'ResultClass'として返す。
-
ResultClassを作成します。
- オブジェクトから派生したもの。
- ただ、計算結果を含む属性しか持っていない。
- 計算結果の一部は、タプルのタプルとして表現されます。私の理解では、これらの結果のために別のクラスを実装し、ResultClassにそのようなオブジェクトのリストを追加することは、さらなるシリアライズのために良いことだと思われます。
-
ResultClass用のSerializerを作成します。
- serializers.Serializerから派生したものです。
- 計算結果は読み取り専用なので、フィールドには IntegerField などの特殊なクラスではなく、ほとんど Field クラスを使用してください。
- 私は結果を保存するつもりはない(私は要求に応じてそれらを返したいだけ)ので、私はResultClassとSerializerの両方でsave()メソッドを暗黙させないでください。
- ネストされた結果に対してシリアライザーをインポートする(上記のタプルのタプルを思い出してください)。
-
計算結果を返すためのViewを作成します。
- APIViewから派生させます。
- get()だけが必要。
- get() で、リクエストから取得したパラメータで CalcClass を作成し、その calc() を呼び出して ResultClass を取得し、Serializer を作成して ResultClass を渡し、Response(serializer.data) を返しています。
-
URL
- 私の場合、apiのルートはありません。様々なcalcの結果(異なるパラメータを持つcalc)を得るためのURLを持っていればいいのです。
- apiブラウジングのためにformat_suffix_patternsを呼び出すことを追加。
何か見落としがあったのでしょうか?一般的にこのアプローチは正しいのでしょうか?
どのように解決するのですか?
Django-rest-frameworkは、モデルに結びつけなくてもうまく動きます。あなたのアプローチは大丈夫そうですが、私はあなたがすべてを動作させるためにいくつかのステップを削減することができると信じています。
例えば、restフレームワークにはいくつかの組み込みレンダラーが用意されています。そのままでは、API コンシューマーに JSON と XML を返すことができます。必要な Python モジュールをインストールするだけで、YAML を有効にすることもできます。Django-rest-frameworkは、dict、list、tupleのような基本的なオブジェクトを、あなたの側で特別な作業をすることなく出力します。
つまり、基本的には引数を受け取り、必要な計算を行い、その結果をREST APIビューにタプルとして返す関数またはクラスを作成するだけです。もし JSON や XML があなたのニーズに合うなら、 django-rest-framework があなたのためにシリアライズを引き受けます。
この場合、ステップ2と3をスキップして、1つのクラスを計算用とAPIコンシューマへの表示用だけに使用することができます。
以下に、いくつかのスニペットを示しますので、参考にしてください。
私はこれをテストしていないことに注意してください。あくまで例として挙げただけですが、動作するはずです :)
CalcClassのことです。
class CalcClass(object):
def __init__(self, *args, **kw):
# Initialize any variables you need from the input you get
pass
def do_work(self):
# Do some calculations here
# returns a tuple ((1,2,3, ), (4,5,6,))
result = ((1,2,3, ), (4,5,6,)) # final result
return result
RESTビューです。
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from MyProject.MyApp import CalcClass
class MyRESTView(APIView):
def get(self, request, *args, **kw):
# Process any get params that you may need
# If you don't need to process get params,
# you can skip this part
get_arg1 = request.GET.get('arg1', None)
get_arg2 = request.GET.get('arg2', None)
# Any URL parameters get passed in **kw
myClass = CalcClass(get_arg1, get_arg2, *args, **kw)
result = myClass.do_work()
response = Response(result, status=status.HTTP_200_OK)
return response
あなたのurls.pyです。
from MyProject.MyApp.views import MyRESTView
from django.conf.urls.defaults import *
urlpatterns = patterns('',
# this URL passes resource_id in **kw to MyRESTView
url(r'^api/v1.0/resource/(?P<resource_id>\d+)[/]?$', login_required(MyRESTView.as_view()), name='my_rest_view'),
url(r'^api/v1.0/resource[/]?$', login_required(MyRESTView.as_view()), name='my_rest_view'),
)
にアクセスすると、このコードがリストのリストを出力するはずです。
http://example.com/api/v1.0/resource/?format=json
. サフィックスを使用する場合は
?format=json
で
.json
. を追加することで、取得したいエンコーディングを指定することもできます。
"Content-type"
または
"Accept"
をヘッダに追加してください。
[
[
1,
2,
3
],
[
4,
5,
6
]
]
これがあなたのお役に立つことを願っています。
関連
-
オペレーショナルエラーです。1050 解決
-
Django。"makemigrations "時に変更が検出されない。
-
[解決済み] SOAPとRESTの比較(相違点)
-
[解決済み] 検証失敗または重複が無効な場合のREST HTTPステータスコード
-
[解決済み] RESTを理解する。動詞、エラーコード、認証
-
[解決済み] Django のクエリで OR フィルタを行うにはどうすればよいですか?
-
[解決済み] Django テンプレート内で現在の URL を取得する方法は?
-
[解決済み】動詞のないREST URLを作成する方法は?
-
[解決済み] Django-Rest-Framework のシリアライザーで Request.User を取得する方法とは?
-
[解決済み] django-tastypie と djangorestframework の違いは何ですか?[クローズド]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Django ForeignKey逆引きクエリにおけるfilterと_setの効率比較
-
Djangoキャッシュの説明
-
[解決済み] Django のビューで 2 つ以上のクエリセットを結合するにはどうすればよいですか?
-
[解決済み] Django South - テーブルはすでに存在する
-
[解決済み] DjangoとReactJSを連携させる方法とは?
-
[解決済み] Django で null を許容するユニークなフィールド
-
[解決済み] Djangoのvalues()の項目名を変更する方法は?
-
[解決済み] egg_infoエラーでpipからインストールできない
-
[解決済み] Django の DoesNotExist 例外はどのようにインポートしますか?
-
[解決済み] すべてのSQLクエリをログに記録