DRF-ModelView Set条件に従ってシーケンス化を選択
4177 ワード
DRF-ModelView Set条件に従ってシーケンス化を選択
さらにdjangoでバックグラウンドを書くとき、restframeworkは多くのことを省き、ここでは異なるリクエストに基づいて異なるシーケンス化を取得し、自分に残して後で使用する方法を記録します.
DRF ModelViewSetのソースコードを表示し、Genericapifiewにシーケンス化の取得方法を記載します.
注記を使用すると、この関数を再ロードできることがわかります.要求が異なるシーケンス化に依存する必要がある場合は、この関数を再ロードできます.
DRFの要求に対応する、このコードを見て、ここでselfを取る.Actionはcreate,retrieve,listなどのフィールドを得ることができ,異なる必要に応じて異なるシーケンス化を実現することができる.私の実現方法は辞書を作って対応し、リロード関数は以下の通りです.
これを初めて勉強して、もしみんながもっと良い案があれば、伝言を歓迎して、間違いがあれば、みんなの指摘を歓迎します.
さらにdjangoでバックグラウンドを書くとき、restframeworkは多くのことを省き、ここでは異なるリクエストに基づいて異なるシーケンス化を取得し、自分に残して後で使用する方法を記録します.
DRF ModelViewSetのソースコードを表示し、Genericapifiewにシーケンス化の取得方法を記載します.
class GenericAPIView(views.APIView):
# ...
def get_serializer_class(self):
"""
Return the class to use for the serializer.
Defaults to using `self.serializer_class`.
You may want to override this if you need to provide different
serializations depending on the incoming request.
(Eg. admins get full serialization, others get basic serialization)
"""
assert self.serializer_class is not None, (
"'%s' should either include a `serializer_class` attribute, "
"or override the `get_serializer_class()` method."
% self.__class__.__name__
)
return self.serializer_class
# ...
注記を使用すると、この関数を再ロードできることがわかります.要求が異なるシーケンス化に依存する必要がある場合は、この関数を再ロードできます.
class ViewSetMixin(object):
# ...
def initialize_request(self, request, *args, **kwargs):
"""
Set the `.action` attribute on the view,
depending on the request method.
"""
request = super(ViewSetMixin, self).initialize_request(request, *args, **kwargs)
method = request.method.lower()
if method == 'options':
# This is a special case as we always provide handling for the
# options method in the base `View` class.
# Unlike the other explicitly defined actions, 'metadata' is implicit.
self.action = 'metadata'
else:
self.action = self.action_map.get(method)
return request
DRFの要求に対応する、このコードを見て、ここでselfを取る.Actionはcreate,retrieve,listなどのフィールドを得ることができ,異なる必要に応じて異なるシーケンス化を実現することができる.私の実現方法は辞書を作って対応し、リロード関数は以下の通りです.
serializer_class = Example_SERIALIZERS_DICT = {
'list': ExampleListSerializer,
'create': ExampleCreateSerializer,
'update': ExampleUpdateSerializer,
'retrieve': ExampleListSerializer,
'partial_update': ExampleUpdateSerializer
}
def get_serializer_class(self):
try:
return self.serializer_class[self.action]
except KeyError:
raise Err #
これを初めて勉強して、もしみんながもっと良い案があれば、伝言を歓迎して、間違いがあれば、みんなの指摘を歓迎します.