3

モデル: ライブラリには多くの本を含めることができます。

現在、特定のライブラリ内の本に対して CRUD を実行するための URL があります。

router.register(r'books/(?P<library_id>[0-9]+)', BookViewSet, base_name='books')

および対応するビュー:

class BookViewSet(viewsets.ModelViewSet):

    serializer_class = BookSerializer
    def get_queryset(self):

        genre_query = self.request.query_params.get('genre', None)
        status_query = self.request.query_params.get('status', None)
        author_query = self.request.query_params.get('author', None)

        books = Book.objects.filter(which_library=self.kwargs.get('library_id'))
        if genre_query:
            books = books.filter(genre=genre_query)
        if status_query:
            books = books.filter(status=status_query)
        if author_query:
            books = books.filter(author=author_query)
        return books 

私はもともと ModelViewSet を使用しませんでしたが、代わりに @api_view デコレータを使用した関数がありました。そのうちの 1 つが次のとおりです (過去 2 週間に追加された本を返す、この関数の別の URL を api/books//new_arrivals として持っていました)。

@api_view(['GET'])
def new_arrivals(request, library_id):
    """
    List all new arrival books in a specific library
    """
    d=timezone.now()-timedelta(days=14)
    if request.method == 'GET':
        books = Book.objects.filter(which_library=library_id)
        books = books.filter(when_added__gte=d)
        serializer = BookSerializer(books, many=True)
        return Response(serializer.data)

ModelViewSets を使用しているときに、どうすればよいですか? 別の URL を追加してから、new_arrivals の別のクラスを作成するか、既存の BookViewSet に関数を作成する必要がありますか? その場合、これらの 2 つの GET メソッドを処理するにはどうすればよいですか?

4

2 に答える 2