2017-03-15 6 views
0

私のアプリで特定のModelViewSetのカスタムpagination_classを正常に実装しましたが、基本的な別のカスタムpagination_classを実装する際に問題がありますViewSetDjango RESTフレームワークのビューセットがpag​​ination_classに従っていません

ここで働いpagination_classおよび関連ModelViewSetです:

class Model1Pagination(PageNumberPagination): 
    page_size = 10 
    page_size_query_param = 'page_size' 
    max_page_size = 100 

class Model1ViewSet(viewsets.ModelViewSet): 
""" 
API endpoint that returns the instances of Model1 
""" 

    queryset = Model1.objects.all() 
    serializer_class = Model1Serializer 
    pagination_class = Model1Pagination 

    @list_route() 
    def extra(self, request) 
    .... 
    return <something> 

そして、これは動作していないpagination_classとビューセットです:

class Model2Pagination(PageNumberPagination): 
    page_size = 1 
    page_query_param = 'page_size' 
    max_page_size = 1 

class Model2GenericViewSet(viewsets.ViewSet): 
""" 
API endpoint to return the instances of Model2 
""" 

    def get_queryset(): 
    return Model2.objects.all() 
    pagination_class = Model2Pagination 

    def list(self, request): 
    queryset = self.get_queryset() 
    serializer = Model2Serializer(queryset, many=True, context={'request': request}) 
    return Response(serializer.data) 

私はModel2GenericViewSetとして機能するように変更することができたとしModelViewSetですが、私はリファクタリングを避けることを望んでいました.DRFドキュメントには次のように書かれています。

ページネーションはあなたが汎用ビューまたはビューセット

を使用している場合は自動的に行われるので、私は大丈夫だろう ViewSetを使用して考え出しました。もともとビューセットに get_queryset()を指定していなかったので、最初は私がそうしなければならないと思っていましたが、それを加えても動作には影響しませんでした。

Model1Paginationといくつかのテストの後、私は改ページが、それは私が改ページが必要なので、私はちょうどこれを見つけた方法ではありませんviewset- Model1extra()方法の結果には適用され見ていませんよ。

上記のドキュメントで引用されていることは、ページングが文字通りビルトインビューセットメソッドにのみ適用されることを意味していますか?

答えて

2

ViewSetクラスはAPIViewから継承されます。関連は: View(Django) - > APIView - > ViewSet

ModelViewSetclassはGenericViewSetから継承します。関係は次のとおりです。(ジャンゴ中) 表示 - > APIView - > GenericAPIView - > GenericViewSet - > ModelViewSet

pagination_classがAPIView.Youから継承あなたはクラスでそれを使用することはできませんので、GenericAPIViewに追加されビューセットを試すことができます.GenericViewSet。これは多くのことができますyou-がありがとう

def list(self, request, *args, **kwargs): 
    students = Student.objects.all() 
    page = self.paginate_queryset(students) 
    if page is not None: 
     serializer = StudentSerializer(page, many=True) 
     return self.get_paginated_response(serializer.data) 
    serializer = StudentSerializer(students, many=True) 
    return Response(serializer.data) 
+0

戻るような応答をページング!私はGenericViewSetから継承し、私の 'list()'メソッドを更新しましたが、今や奇妙なことが起こっています。レスポンスにはページがあるように見えますが、各ページにはクエリーセット全体があります。私のDBには21の「Students」インスタンスがあり、 'page_size' = 1を試しています。ページには1ページではなく、21個のオブジェクトすべてがリストされます。編集:これは私自身のせいで、 'if'ブロック内のシリアライザに' page'を渡すのを忘れました – dkhaupt

0

あなたがに、

... 
return self.get_paginated_response(serializer.data) 

手動で、あなたがリストを上書きする場合は()を持っています。

関連する問題