2016-11-25 13 views
4

私は2つのモデルがあります:ジャンゴ・休憩・フレームワーク:ネストされたオブジェクトをページ分割

class Book(models.Model): 
    title = models.CharField(max_length=250) 
    author = models.CharField(max_length=250) 
class WordInBook(models.Model): 
    book = models.ForeignKey("Book") 
    word = models.ForeignKey("Word") 

と、対応するシリアライザを:

class BookSerializer(ModelSerializer): 
    wordinbook_set = WordInBookSerializer(many=True) 

    class Meta: 
     model = Book 
     fields = ('id', 'title', 'author', 'wordinbook_set') 

class WordInBookSerializer(ModelSerializer): 
    class Meta: 
     model = WordInBook 
     fields = ('word') 

今私はwordinbook_setページ番号を付けたいです。シリアライザの外では簡単です:

book = Book.objects.get(pk=book_id) 
paginator = Paginator(book.wordinbook_set.all(), 10) 
words = paginator.page(page).object_list 

しかし、それは私に2つの別々のシリアル化されたオブジェクトを残します。

質問:どうすればシリアライザ内でwordinbook_setをページ付けできますか?
結果のJSONは次のようになります。

{id: '...', title: '...', author: '...', wordinbook_set: [ 10 WordInBook objects here ]} 

答えて

0

うーん、あなたは少し違って取り組むべきであると信じています。

まず - BooksViewSet@detail_routeを定義する - 単語・イン・ブック言うことができます:あなたのページ分割の結果を返します

/books/1/word-in-book/:あなたは追加のエンドポイントを取得します。このように

@detail_route(method=['GET'], url_path='word-in-book') 
def word_in_book(self, request, *args, **kwargs): 
    object = self.get_object() 
    queryset = object.wordinbook_set.all() 

    page = self.paginate_queryset(queryset) 
    if page is not None: 
     serializer = WordInBookSerializer(page, many=True) 
     return self.get_paginated_response(serializer.data) 

    serializer = self.get_serializer(queryset, many=True) 
    return Response(serializer.data) 

を本のモデルの単語の。

これが役に立ちます。

私は、あなたの場合のページネーションは不可能だと信じています - あなたはちょうど戻って言うことができるコードを変換することができます:10最初のオブジェクト。

関連する問題