調査結果を残しておく。
URLキーワード引数とは
Djangoを使うと、以下のような内容をurl.pyに定義することになる。url.py
urlpatterns = [
path('samples/<int:sample_id>/params/<str:param_name>/', SampleView.as_view())
]
上のコードの <int:sample_id> や <str:param_name>に代入される値がURLキーワード引数である。
serializerでの取得方法
最初、serializerで直接取得する方法を探していたのだが、見つけられなかった。
そのため、viewから渡す、という方法を取ることにした。
調査すると、GenericAPIViewに定義されているget_serializer_contextをオーバーライドすれば、実現可能と判明した。
ちなみに、Django REST FrameworkのAPIView(ListCreateAPIViewとか)は全てGenericAPIViewを継承しているので、大体どのAPIViewでも以下の方法で対応できる。
以下、実装
view
class SampleView(generics.GenericAPIView):
serializer_class = SampleSerializer
def get_serializer_context(self):
"""serializerに渡す項目の設定"""
# 親クラスを呼び出して、デフォルトのcontextを取得する
context = super().get_serializer_context()
# 作成したcontextに追加項目を設定する
context['sample_id'] = self.kwargs.get('sample_id')
context['param_name'] = self.kwargs.get('param_name')
# 注意事項
# self.kwargs.get('sample_id')をself.kwargs['sample_id']のようにすると落ちる
return context
serializer
def validate(self, data):
# context経由で設定した値が取得できる
sample_id = self.context['sample_id']
param_name = self.context['param_name']
注意事項
viewのコード上でもコメントを入れたが、
self.kwargs.get('sample_id')をself.kwargs['sample_id']のようにすると落ちる。
ちなみに、理由は追いかけられてない・・・。
知ってる人いたら教えてください・・・。
参考資料
https://www.django-rest-framework.org/api-guide/generic-views/#genericapiview
0 件のコメント:
コメントを投稿