Una habilidad para interactuar con la API de Vista, permitiendo a los usuarios recuperar y gestionar datos de manera eficiente.
Guia en espanol para crear endpoints con Django Ninja (vistas basadas en funcion) usando tipado, esquemas Pydantic y manejo limpio de errores 4xx con if. El codigo de ejemplo va en ingles.
ninja.Router con autenticacion que corresponda (JWTAuth u otra) y tags descriptivos.Schema (o ModelSchema cuando aplica). Definir ErrorSchema para mensajes de error.if y retornar tuplas (status_code, schema_instance) para 400/404 sin bloques try/except cuando no hay excepciones reales.backend/core/api/*.py (routers y endpoints por dominio).backend/core/schemas/ (o core/schemas.py segun organizacion existente) para request/response.backend/core/models/.backend/core/services/ para logica reutilizable; las vistas llaman a servicios.backend/core/utils.py para helpers (por ejemplo, procesamiento de imagenes).from decimal import Decimal
from typing import Optional
from ninja import Router, Schema
from ninja_jwt.authentication import JWTAuth
router = Router(auth=JWTAuth(), tags=["products"])
class ErrorSchema(Schema):
message: str
class ProductIn(Schema):
name: str
price: Decimal
stock: int = 0
class ProductOut(Schema):
id: int
name: str
price: Decimal
stock: int
@router.get("/{product_id}", response={200: ProductOut, 404: ErrorSchema})
def get_product(request, product_id: int):
"""Obtiene un producto por id para el usuario autenticado."""
product = (
Product.objects.filter(id=product_id, user=request.user)
.select_related("place", "category", "brand")
.first()
)
if not product:
return 404, ErrorSchema(message="Product not found")
return 200, ProductOut.from_orm(product)
@router.post("/", response={201: ProductOut, 400: ErrorSchema})
def create_product(request, payload: ProductIn):
"""Crea un producto simple con datos validados."""
if payload.price <= 0:
return 400, ErrorSchema(message="Price must be positive")
product = Product.objects.create(
user=request.user,
name=payload.name,
price=payload.price,
stock=payload.stock,
)
return 201, ProductOut.from_orm(product)
select_related y filtros claros en vez de try/except para 404.Decimal para montos, Optional donde corresponda y defaults explicitos.