第三に、いくつかのビューのソース解析を達成するために:ネイティブビュー、rest_framework.views.APIView、rest_framework.generics.GenericAPIView、ViewSetMixinジャンゴ

A、ジャンゴネイティブビュー:

  1、プログラム、プリロードURL、実行as_view()関数が返すビューを開始します

パス(' 書籍/ '、views.BookView.as_view())、

 

  ディスパッチに、ビューを実行する2は、ユーザのアクセス方法:

 

 

   戻り値はビューの派遣の戻り値であるので、3、実行の派遣戻り値self.get、ビュービューコールディスパッチ、ビュークラスBookViewコールは、戻り値は、ページの値に戻され、ビューディスパッチの戻り値であります。

 

II:rest_framework.views.APIView要求プロセスの使用:

re_path(' ^書籍/(\ dは+)'、views.BookDetailView.as_view())、

  1、ネイティブビュージャンゴAPIView承継、戻り値のスーパークラスAPIViewリターンas_viewビューでas_view方法

 

   図2に示すように、ユーザのアクセス方法は、ディスパッチに、ビューを実行する:APIView下ディスパッチが優先ので、APIView下発送方法を達成します。

 

   3、実行返す応答ディスパッチは、戻り値は、ビューの応答に等しいです。戻り値の図である応答であるように、ビューのビューコールディスパッチは、ビュークラスBookViewコールは、戻り値の派遣は、派遣の戻り値は、その値がページに返され、戻り値の図です。

  

 

三、rest_framework.generics.GenericAPIView:それはAPIView、下で包装、いくつかの異なるクラスに実装された冗長コードの元のビューでだけの簡易包装です

パス(' 作者/ '、views.AuthorView.as_view())、
クラスAuthorViewと(mixins.ListModelMixin、mixins.CreateModelMixin、generics.GenericAPIView):
    クエリセット = models.Author.objects.all()
    serializer_class = serializers.AuthorSerializers 

    デフのget(自己、要求、* argsを、** kwargsから):
         リターン・セルフ。リスト(リクエスト、* argsを、** kwargsから)

    デフ投稿(自己、要求、* argsを、** kwargsから):
         リターン self.create(要求、* argsを、** kwargsから)

  1はgenerics.GenericAPIViewはしなかったの下で、父親のas_view方法、mixins.ListModelMixinにロードされた番組を視聴するためには、次のmixins.CreateModelMixinを見つけられませんでしたが、それを継承APIView、それを実行し、ビューに戻り、APIViewです。

 

   図2に示すように、ビューへのユーザーアクセスの実装は、戻り値のビューがディスパッチの戻り値であり、実行時間優先発送APIView下で行う、ディスパッチ戻り値は、ビューの戻り値であります

 

   3、バックビュー、ビューのためのリストメソッドの戻り値の戻り値は、リストビュークラスは、親を見つけるために、メソッドを実装していません

 

   図4は、mixins.ListModelMixin方法は、リスト、データは、ビューによって返され、それはデータの配列を返し、それを実行し、その後ディスパッチに戻り、次に表示を有しています。しかし、このプロセスは、この方法を見て、それを達成する方法ですget_queryset

 

   5は、get_queryset:この方法は、generics.GenericAPIViewに発見されました

 

  

  図6は、リストトーンget_querysetは、ビューのリストを調整するので、self.querysetビュークラスクエリセットであります

 

   7、リストたちは、ビューオブジェクトのシリアル化リターンクエリセットのメソッドに渡した後、

 

ViewSetMixinの4、viewsets.ModelViewSet

パス(' 書籍/ '、views.BookView.as_view({ ' 得る'' リスト'' ポスト'' 作成' }))、

  1、ViewSetMixinは、ビューの下でネイティブのDjango as_viewではありません。この時点で、それはURLで、すなわち辞書に、アクションパラメータを受信した知人のプログラム実行as_view、

  2、ユーザアクセスは、実行ビューには、この時間は、「ポスト」を「取得」と文字列のようなself.list self.createrに等しいです。

 

   図3に示すように、ステップ調査ディスパッチによるステップは、GenericAPIView継承APIView、APIView実現GenericAPIViewは実現しなかった、ViewSetMixinで実現しませんでした

 

 

 

   self.list 4、ディスパッチAPIView下で実行、実行戻ります

 

   5、self.listを探して、それがListModelMixinあるクラスのリスト方法を見つけます

 

 

 要約:

  ビュークラスの継承は、ネイティブviews.View Djangoのとき:as_viewを()ビューを返し、その戻り値が返り値を派遣に等しい、戻り値は、ディスパッチビュークラスのGET、POSTなどに等しい行われます

  rest_framework、as_view(下の場合ビュークラス継承APIView)依然としてネイティブas_view Viewクラス下で行うが、APIView発送方法を覆うので、戻り値は、ディスパッチAPIViewのビューが実行されます。これは、新しい要求を再構築します

二つの方法上記のコードを合理化するためにミックスインクラスとして、ビュー、あまりにも多くの冗長コードを達成する際に理由は次のとおりです。

  継承ListCreateAPIViewとRetrieveUpdateDestroyAPIViewクラスは、唯一のクエリセットオブジェクトはクラスをシリアライズすることができます提供する必要があります。一貫して取得するためのビュー内の最後のステップだけas_viewディスパッチと実行APIViewは、ポストなどをミックスインクラスでカプセル化されています。

  viewsets.ModelViewSetクラスは、すべてのみCBVで実現することができるURLリクエストの方法によって達成することができます。主にas_view実行は、もはやネイティブのViewクラスの下as_viewが、ViewSetMixin下as_viewではありません。これは、ユーザが実行アクセスした場合の制御処理をディスパッチに実行された後、URLに対応する辞書の方法を実行し、ビューを返し、彼はビューのクラスミックスインの方法で対応する実行クラスおよびメソッドを見つけることができ、例えばself.list、自己.create

 

おすすめ

転載: www.cnblogs.com/aizhinong/p/12543799.html