2016-11-25 2 views
4

J'ai deux modèles:Django-Rest-cadre: Paginate objet imbriqué

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") 

Et serializers correspondants:

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') 

Maintenant, je veux paginer le wordinbook_set. En dehors du sérialiseur, c'est facile:

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

Mais cela me laisse avec deux objets sérialisés distincts. Question: comment paginer wordinbook_set dans le sérialiseur?
Le JSON résultant devrait ressembler à ceci:

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

Répondre

0

Hmm, croyez que vous devriez aborder peu différemment.

D'abord - définir la @detail_route sur la BooksViewSet - permet de dire mot dans le livre:

@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) 

De cette façon, vous obtiendrez le point final supplémentaire:

/books/1/word-in-book/ qui vous renvoie les résultats paginés de mot dans les modèles de livres.

Espérons que cela aide.

Je crois que la pagination dans votre cas n'est pas possible - vous pouvez juste transformer un peu de code pour revenir disons: 10 premiers objets.