DRF-ModelView Set条件に従ってシーケンス化を選択

4177 ワード

DRF-ModelView Set条件に従ってシーケンス化を選択
さらに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 #          

これを初めて勉強して、もしみんながもっと良い案があれば、伝言を歓迎して、間違いがあれば、みんなの指摘を歓迎します.