Validaciones (serializers.py)

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

Endpoints personalizados (views.py)

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)