2019年11月16日

URLキーワード引数をDjango REST Frameworkのserializerで使う

URLキーワード引数をDjango REST Frameworkのserializerで使いたかったのだが、渡し方がよくわからなかった。
調査結果を残しておく。



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 件のコメント:

コメントを投稿