# Recipe API #### Caracteristicas - Crear - Listar - Ver detalles - Actualizar - Borrar #### Endpoints - `/recipes/` - `GET` Listar todas las recetas - `POST` Crea recetas - `/recipes/`/ - `GET` Ver detalles de receta - `PUT/PATCH` Actualizar receta - `DELETE` Borrar receta ### APIView vs Viewsets Una vista maneja un request a una URL, DRF usa clases con lógica reutilizable. DRF además soporta decoradores. `APIView` y `Viewsets` son clases base falicitadas por DRF. ### APIView - Concentradas alrededor de los metodos HTTP - Métodos de clase para los métodos HTTP `GET`, `POST`, `PUT`, `PATCH`, `DELETE` - Ofrece flexibilidad sobre toda la estuctura de las URL y la lógica usada para procesar estas peticiones - Util para APIs sin CRUD. Lógica a la medida, ej. auth, jobs, apis externas ### Viewsets - Concentradas alrededor de aciones - Retrive, list, update, partial update, destroy - Mapea los modelos de Django - Usa rutas para generar URLs - Genial para operaciones CRUD en los modelos ## Test Create Recipe [core/tests/test_models.py](./app/core/tests/test_models.py) ```py from decimal import Decimal ... from core import models class ModelTests(TestCase): ... def test_create_recipe(self): """Test creating a recipe is successful.""" user = get_user_model().objects.create_user( 'test@example.com', 'test123', ) recipe = models.Recipe.objects.create( user=user, title='Nombre receta ejemplo', time_minutes=5, price=Decimal('5.50'), decription='Descripción de la receta de ejemplo' ) self.assertEqual(str(recipe), recipe.title) ``` ## Creación del modelo [`core/models.py`](./app/core/models.py) ```py ... class Recipe(models.Model): """Recipe object.""" user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, ) title = models.CharField(max_length=255) description = models.TextField(blank=True) time_minutes = models.IntegerField() price = models.DecimalField(max_digits=5,decimal_places=2, blank=True) link = models.CharField(max_length=255, blank=True) def __str__(self): return self.title ``` ### Agregar al panel de administración [`core/admin.py`](./app/core/admin.py) ```py ... admin.site.register(models.Recipe) ``` ### Crear migraciones `docker compose run --rm app sh -c "python manage.py makemigrations"` ```sh [+] Creating 1/0 ✔ Container recipes_api_django-db-1 Running 0.0s Migrations for 'core': core/migrations/0002_recipe.py - Create model Recipe ```