2016-06-17 13 views
1

私はDjango REST Frameworkを使用してPDFドキュメントを生成するエンドポイントを作成しています。 PDFドキュメントには、特定のDepartmentに対応する情報があります。 PDFドキュメントをダウンロードし、ブラウザ内でドキュメントをプレビューできるようにするには、2つの機能が必要です。Django REST Framework - ListAPIViewのリストをオーバーライドできません

アプリケーションに追加されたデータに基づいてPDF文書が時間の経過とともに変更されるため、文書は要求時にリアルタイムで生成する必要があります。最初のステップとして、私は次のエンドポイントがGET要求でヒットしたときに、ドキュメントがリモートファイルの保存場所に生成されていしようとしている:私のエンドポイントのみGET要求を取る必要がありますので

departments/<department_pk>/result/preview

、私はListAPIViewを使用しています。 listメソッドをオーバーライドしてカスタムドキュメント生成ロジックが実行されるようにしようとしていますが、メソッドが呼び出されないようです。エンドポイントがGETリクエストによってヒットしたときに実行されるように、カスタムドキュメント生成ロジックをエンドポイントに挿入する方法を教えてください。

API/urls.py

url(r'^departments/(?P<department_pk>[0-9]+)/result/preview', 
    include(result_document_urls.result_document_preview_router.urls, 

urls.py document_app/

result_document_preview_router = routers.DefaultRouter() 

result_document_preview_router.register(r'^', ResultDocumentDetailView.as_view(), 
    base_name='Department') 

views.py document_app/

class ResultDocumentDetailView(generics.ListAPIView): 

    queryset = Department.objects.all() 
    lookup_field = 'department_pk' 
    lookup_url_kwarg = 'department_pk' 

    def list(self, request, department_pk): 
     queryset = self.get_queryset() 
     import ipdb; ipdb.set_trace() # this break point is never hit 
     department = get_object_or_404(queryset, department_pk=department_pk) 
     ...generate document logic... 
     return Response(status=status.HTTP_200_OK) 
+0

「RetrieveAPIView」を使用する必要があります。 'ListAPIView'はコレクションを返すためのものです。 'Retrieve ...'は一つのインスタンスを取得するためのものです。これは言われていますが、私はなぜ 'list'が呼び出されないのか分かりません。 – Louis

+0

@louis yeah、私にも意味をなさない。私はもともと 'RetrieveAPIView'を使用していましたが、' RetrieveAPIView'のURLの最後に 'pk'が必要かどうか分からなかったので、' ListAPIView'に切り替えました。 – orange1

答えて

1

をoverrinding方法「リスト」を参照してください、あなたは間違って代わりにビューセットの引数としてResultDocumentDetailViewを渡しています。

ルータwhile registeringは、APIViewの代わりにViewSetを受け入れます。

register()方法には2つの必須の引数があります。

prefix - ルートのこのセットで使用するURL接頭辞を。
viewset - ビューセットクラス

あなたはretrieve方法にのみ関心があるので、また、あなただけのResultDocumentRetrieveViewを作成し、ResultDocumentルータを作成する必要がなく、あなたのurls.pyに対応するURLを追加することができます。 (あなたは両方listdetail要求を処理するときにルータが一般的に使用されている。)

class ResultDocumentRetrieveView(generics.RetrieveAPIView): 

    queryset = Department.objects.all() 
    lookup_field = 'department_pk' 
    lookup_url_kwarg = 'department_pk' 

    def retrieve(self, request, department_pk): 
     department = self.get_object() 
     ...generate document logic...  
     return Response(status=status.HTTP_200_OK) 

のURL。py

url(r'^departments/(?P<department_pk>[0-9]+)/result/preview', ResultDocumentRetrieveView.as_view()) 
1

コードの下にリスト方式に取って代わる、私はそれを考えます働くでしょう

class ResultDocumentDetailView(generics.ListAPIView): 

    queryset = Department.objects.all() 
    lookup_field = 'department_pk' 
    lookup_url_kwarg = 'department_pk' 

    def list(self, request, *args, **kwargs): 
     queryset = self.get_queryset() 
     import ipdb; ipdb.set_trace() # this break point is never hit 
     department = get_object_or_404(
      queryset, department_pk=kwargs.get('department_pk') 
     ) 

     ...generate document logic... 

     return Response(status=status.HTTP_200_OK) 
複数の基準について

があなたのdocument_app/urls.py

https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/mixins.py#L35

+0

これは私が与えたサンプルコードとどう違うのですか?インデントを除いて、これはオフに見えます。何か不足していますか?ありがとう。 – orange1

+0

@ orange1メソッド "list"を正しく定義していません。正しい定義は "def list(self、request、* args、** kwargs):"です。試しましたか ?それが動作します。 –

+0

はい、私はそれを試してみました。うまく行かなかった。 – orange1

関連する問題