2017-10-21 24 views
0

私はDjango Restフレームワークをかなり新しくしています。私は本当にたくさんのものをクリアするためのいくつかの質問がありました。Django Restフレームワーク。 Retrieveがどのように動作するか

私が取得し、ListAPIViewのような単純なCRUD汎用ビューのためのドキュメントを見ていた

...など

私のリストビューについては、私はこのようにそれを作成しました:理由の理にかなっている

class CourseListApiView(ListAPIView): 
    queryset = Course.objects.all() 
    serializer_class = CourseListSerializer 

クエリーセットはCourse.objects.all()を返し、すべてのコースが表示されます。私はおよそ明確ではないよ何

これは私の取得図であるRetrieveApiでクエリセットが

class CourseRetrieveAPIView(RetrieveAPIView): 
    queryset = Course.objects.all() 
    serializer_class = CourseRetrieveSerializer 

をどのように動作するかで、それは私のリンクからPKを取り、対応するコースを返します。私には不明な点は、クエリーセットがCourse.objects.all()であり、URLからkwargsを取得し、自分のコースをフィルタするフィルタされたクエリではない理由です。私はそれを私の方法を試してみましたが、同じ結果を得た、私の見解でした:クエリセットはCourse.objects.filterあるので、これはより多くの理にかなって

class CourseRetrieveAPIView(RetrieveAPIView): 
    serializer_class = CourseRetrieveSerializer 

    def get_queryset(self): 
     queryset = Course.objects.filter(pk=self.kwargs.get('pk')) 
     return queryset 

(PK = self.kwargs.get(「PK」))の代わりに私のコースはURLのpkで自分のコースをフィルタリングしているので、私には意味がありません。

私の質問は理にかなっています。説明が必要な場合はコメントを残してください。答えはかなりわかりますが、私はフレームワークにとって非常に新しいです。

答えて

2

rest_frameworkのコードベースを調べる必要があります。 get_objectという名前の関数は、それぞれlookup_fieldlookup_url_kwargという名前の2つのクラス変数を使用し、デフォルト値はそれぞれpkNoneです。 rest_framework/generics.py

def get_object(self): 
    """ 
    Returns the object the view is displaying. 

    You may want to override this if you need to provide non-standard 
    queryset lookups. Eg if objects are referenced using multiple 
    keyword arguments in the url conf. 
    """ 
    queryset = self.filter_queryset(self.get_queryset()) 

    # Perform the lookup filtering. 
    lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field 

    assert lookup_url_kwarg in self.kwargs, (
     'Expected view %s to be called with a URL keyword argument ' 
     'named "%s". Fix your URL conf, or set the `.lookup_field` ' 
     'attribute on the view correctly.' % 
     (self.__class__.__name__, lookup_url_kwarg) 
    ) 

    filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]} 
    obj = get_object_or_404(queryset, **filter_kwargs) 

    # May raise a permission denied 
    self.check_object_permissions(self.request, obj) 

    return obj 

GenericAPIViewから

抜粋あなたがlookup_url_kwargを見ることができるようには何も指定されていない場合lookup_fieldに等しくなるように設定されています。この値を要件のフィールドに変更すると、get_object_or_404のフィルタが変更されます。

url kwargsでフィルタを手動で指定する場合は、RetrieveAPIViewで提供されている機能を使用していません。代わりにpkで結果を除外してurl kwargsget_querysetにしてから、そのクエリセットの結果をget_objectに送信すると、同じことが再び実行されます。

関連する問題