def validate_{fieldname} debe ser el mismo nombre del campo
class ProductoSerializer(serializers.ModelSerializer):
class Meta:
model = Producto
fields = '__all__'
def validate_precio(self, value):
if value <= 0:
raise serializers.ValidationError("El precio debe ser mayor a 0.")
return value
def validate_stock(self, value):
if value < 0:
raise serializers.ValidationError("El stock no puede ser negativo.")
return value
class ReservaSerializer(serializers.ModelSerializer):
class Meta:
model = Reserva
fields = '__all__'
def validate_fecha_reserva(self, value):
if value < now():
raise serializers.ValidationError("La fecha y hora de reserva no pueden estar en el pasado.")
return value
@action: Permite agregar endpoints adicionales a un ViewSet.
o detail=False: Indica que este endpoint no requiere un ID especĂfico (es para una
lista).
methods=['get']: Especifica que este endpoint solo acepta solicitudes GET
request.query_params: Recupera parámetros enviados en la URL, como
/productos/filtrar_por_stock/?stock_minimo=10.
self.queryset.filter: Filtra los productos con stock mayor o igual al valor proporcionado.
from rest_framework.decorators import action
from rest_framework.response import Response
class ProductoViewSet(viewsets.ModelViewSet):
queryset = Producto.objects.all()
serializer_class = ProductoSerializer
@action(detail=False, methods=['get'])
def filtrar_por_stock(self, request):
stock_minimo = request.query_params.get('stock_minimo', 1)
productos = self.queryset.filter(stock__gte=stock_minimo)
serializer = self.get_serializer(productos, many=True)
return Response(serializer.data)