Lección 8: Listar
Pero claro, necesitaremos listar todos los libros. Haremos un GET donde listaremos todos los elementos.
Creamos los test adecuados.
# tests/libros/test_views.py
import pytest
from app.libros.models import Libros
@pytest.mark.django_db
def test_add_book(client):
# Given
libros = Libros.objects.all()
assert len(libros) == 0
# When
resp = client.post(
"/api/libros/",
{
"title": "El fin de la eternidad",
"genre": "Ciencia Ficción",
"author": "Isaac Asimov",
"year": "1955",
},
content_type="application/json"
)
# Then
assert resp.status_code == 201
assert resp.data["title"] == "El fin de la eternidad"
libros = Libros.objects.all()
assert len(libros) == 1
@pytest.mark.django_db
def test_get_single_book(client):
# Given
libro = Libros.objects.create(
title="El fin de la eternidad",
genre="Ciencia Ficción",
author="Isaac Asimov",
year="1955",
)
# When
resp = client.get(f"/api/libros/{libro.id}/")
# Then
assert resp.status_code == 200
assert resp.data["title"] == "El fin de la eternidad"
@pytest.mark.django_db
def test_get_single_book_incorrect_id(client):
# When
resp = client.get(f"/api/libros/-1/")
# Then
assert resp.status_code == 404
@pytest.mark.django_db # nuevo
def test_get_all_books(client, faker): # <- atención que se añade 'faker'
# Given
def create_random_book():
return Libros.objects.create(
title=faker.name(),
genre=faker.job(),
author=faker.name_nonbinary(),
year=faker.year(),
)
libro_1 = create_random_book()
libro_2 = create_random_book()
# When
resp = client.get(f"/api/libros/")
# Then
assert resp.status_code == 200
assert resp.data[0]["title"] == libro_1.title
assert resp.data[1]["title"] == libro_2.title
Creamos las vista.
# app/libros/views.py
from django.http import JsonResponse
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .serializers import LibroSerializer
from .models import Libros
def ping(request):
data = {"ping": "pong!"}
return JsonResponse(data)
class LibrosList(APIView):
def get(self, request): # nuevo
libros = Libros.objects.all().order_by('created_at')
serializer = LibroSerializer(libros, many=True) # many=True para listar
return Response(serializer.data, status=status.HTTP_200_OK)
def post(self, request):
serializer = LibroSerializer(data=request.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)
class LibrosDetails(APIView):
def get(self, request, pk):
libro = Libros.objects.filter(pk=pk).first()
if libro:
serializer = LibroSerializer(libro)
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(status=status.HTTP_404_NOT_FOUND)
No es necesario registrar una nueva ruta, ya que usaremos la misma que POST, salvo que al usar GET listará los libros.
Puedes ejecutar el test.
Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivadas 4.0 Internacional.
¿Me invitas a un café? ☕
Puedes hacerlo usando el terminal.
ssh customer@andros.dev -p 5555
Comentarios
Nuevo comentario
Nueva replica {{ formatEllipsisAuthor(replyComment.author) }}
Escribe el primer comentario
{{ formatDate(fields.createdAt) }}
{{ filterHTMLTags(fields.message) }}
{{ comments.length }} comentarios