def patch(self, request, id): book = get_object_or_404(Book, id=id) serializer = BookSerializer(book, data=request.data, partial=True) if serializer.is_valid(): serializer.save() return JsonResponse(data=serializer.data, status=status.HTTP_200_OK) return JsonResponse(data="wrong parameters", status=status.HTTP_400_BAD_REQUEST)
def get(self, request): title = request.GET.get('title', None) author = request.GET.get('author', None) language = request.GET.get('language', None) pub_date = request.GET.get('pub_date', None) if title is None and author is None and pub_date is None and language is None: books = Book.objects.all() else: filter_query = {} if title is not None: filter_query['title__icontains'] = title if author is not None: filter_query['author__icontains'] = author if language is not None: filter_query['language'] = language if pub_date is not None: if '-' in pub_date: from_year, to_year = pub_date.split('-') filter_query['pub_date__lte'] = to_year filter_query['pub_date__gte'] = from_year else: filter_query['pub_date'] = pub_date books = Book.objects.filter(**filter_query) serializer = BookSerializer(books, many=True) return Response(serializer.data, status=status.HTTP_200_OK)
def test_filter_books_with_string_queries_pub_date_range(self): book1 = create_a_book(title='title 1', pub_date=2019) book2 = create_a_book(title='title 2', pub_date=2015) create_a_book(title='title 3', pub_date=2012) create_a_book(title='title 3', pub_date=2020) res = self.client.get('/api/books?pub_date=2015-2019') serializer = BookSerializer([book1, book2], many=True) self.assertEqual(res.data, serializer.data)
def test_filter_books_with_string_queries_language_many_matching(self): book1 = create_a_book(title='title 1', author='Jack Ko', language='en') book2 = create_a_book(title='title 2', author='Jack Koko', language='en') create_a_book(title='title 3', author='Jack Koro', language='pl') res = self.client.get('/api/books?language=en') serializer = BookSerializer([book1, book2], many=True) self.assertEqual(res.data, serializer.data)
def test_filter_books_with_string_queries_author_many_matching(self): book1 = create_a_book(title='title 1', author='Jack Ko') book2 = create_a_book(title='title 2', author='Jack Koko') book3 = create_a_book(title='title 3', author='Jack Koro') create_a_book(title='title 3', author='Jammie Koro') res = self.client.get('/api/books?author=Jack') serializer = BookSerializer([book1, book2, book3], many=True) self.assertEqual(res.data, serializer.data)
def test_filter_books_with_string_queries_title_many_matching(self): book1 = create_a_book(title='Hobbit') book2 = create_a_book(title='Hobbit 2') book3 = create_a_book(title='This is Hobbit 3') create_a_book(title='This is my Hobby') res = self.client.get('/api/books?title=Hobbit') serializer = BookSerializer([book1, book2, book3], many=True) self.assertEqual(res.data, serializer.data)
def delete(self, request, id): book = get_object_or_404(Book, id=id) serializer = BookSerializer(book) book.delete() return Response(serializer.data, status=status.HTTP_200_OK)
def post(self, requset): serializer = BookSerializer(data=requset.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)