title: Problems to make relationships between four tables Flask and flask-sqlalchemy
body: <p>im learning about Flask and flask-sqlalchemy relationships. I have five tables Clientes, Solicitud, Cotizacion, Servicio, Asesor. Im trying to get Service cost for a specific Request (Solicitud) table but i dont get it, why i cant get this value for a specific id Request (Solicitud) in crearcotizacion view. The process is like this: A client is created, then a Service and a Asesor(Advisor) is created. Then in crearsolicitudes view, all clients are listed, click on crear solicitud plus button, and then the create request form appears, the data of the client and request all ok. When i try to create a new quotation (cotizacion) crearcotizacion view, i cant bring the cost of the service value that belongs to that request and service. I try to create a foreing key between request (Solicitud) and Servicio but it doesnt work.</p>
  <p>My Model</p>
  <pre><code>class Clientes(db.Model):
    
      __tablename__ = &quot;clientes&quot;
  
      id = db.Column(db.Integer, primary_key=True)
      nombres = db.Column(db.String(80), nullable=False)
      apellidos = db.Column(db.String(80), nullable=False)
      correo = db.Column(db.String(120), nullable=False)
      empresa = db.Column(db.String(120), nullable=False)
      celular = db.Column(db.String(50), nullable=False)
      mensaje = db.Column(db.String(500), nullable=False)
      checkbox = db.Column(db.Boolean, nullable=False)
      cotizaciones = db.relationship('Cotizacion', backref='clientes_cotizan', lazy=True)
      solicitudes = db.relationship('Solicitud', backref='sol_client', lazy=True)
      servicios = db.relationship('Servicio', backref='clientes_servicios', lazy=True)
  
      def __init__(self, nombres, apellidos, correo, empresa, celular, mensaje, checkbox, sol_client, clientes_servicios):
          
          self.nombres = nombres
          self.apellidos = apellidos
          self.correo = correo
          self.empresa = empresa
          self.celular = celular
          self.mensaje = mensaje
          self.checkbox = checkbox
          self.sol_client = sol_client
          self.clientes_servicios = clientes_servicios
          
      def __repr__(self):
          return '&lt;Clientes %r&gt;' % self.id
  
  
  class Solicitud(db.Model):
      __tablename__ = &quot;solicitud&quot;
  
      id = db.Column(db.Integer, primary_key=True)
      
      servicio_campo = db.Column(db.String(120), nullable=False)
      asesore = db.Column(db.String(120), nullable=False)
  
       # LLAVE FORANEA
      solicitud_cliente = db.Column(db.Integer, db.ForeignKey(&quot;clientes.id&quot;), nullable=True)
      solicitudes_cliente = db.relationship('Cotizacion', backref='clientes_solicitan', lazy=True)
      solicitudes_servicio = db.relationship('Servicios', backref='solicitud_servicios', lazy=True)
      
      def __init__(self, servicio_campo, asesore, sol_client, clientes_servicios):
         
          self.servicio_campo = servicio_campo
          self.asesore = asesore
          self.sol_client = sol_client
          self.clientes_servicios = clientes_servicios
       
  
  class Cotizacion(db.Model):
      __tablename__ = &quot;cotizacion&quot;
  
      id = db.Column(db.Integer, primary_key=True)
     
      numero_horas = db.Column(db.Integer, nullable=False)
      
      descuento = db.Column(db.Integer, nullable=False)
      valor_total = db.Column(db.Integer, nullable=False)
  
      # LLAVE FORANEA
      cliente_id = db.Column(db.Integer, db.ForeignKey(&quot;clientes.id&quot;), nullable=True)
      solicitud_id = db.Column(db.Integer, db.ForeignKey(&quot;solicitud.id&quot;), nullable=True)
      
      def __init__(self, numero_horas, descuento, valor_total, clientes_cotizan, clientes_solicitan):
         
          self.numero_horas = numero_horas
          self.descuento = descuento
          self.valor_total = valor_total
          self.clientes_cotizan = clientes_cotizan
          self.clientes_solicitan = clientes_solicitan
          
      def __repr__(self):
          return '&lt;Cotizacion %r&gt;' % self.id
  
  
  
  class Servicio(db.Model):
      __tablename__ = &quot;servicio&quot;
  
      id = db.Column(db.Integer, primary_key=True)
      nombre_servicio = db.Column(db.String(120), nullable=False)
      costo_servicio = db.Column(db.Integer, nullable=False)
      
      # LLAVE FORANEA
      cliente_id = db.Column(db.Integer, db.ForeignKey(&quot;clientes.id&quot;), nullable=True)
      solicitud_id = db.Column(db.Integer, db.ForeignKey(&quot;solicitud.id&quot;), nullable=True)
      
  
      def __init__(self, nombre_servicio, costo_servicio, clientes_servicios, solicitud_servicios):
          self.nombre_servicio = nombre_servicio
          self.costo_servicio = costo_servicio
          self.clientes_servicios = clientes_servicios
          self.solicitud_servicios = solicitud_servicios
      
          
  class Asesor(db.Model):
      __tablename__ = &quot;asesor&quot;
  
      id = db.Column(db.Integer, primary_key=True)
      primernombre_asesor = db.Column(db.String(120), nullable=False)
      apellido_asesor = db.Column(db.String(120), nullable=False)
      correo_asesor = db.Column(db.String(150), nullable=False)
  
      def __init__(self, primernombre_asesor, apellido_asesor, correo_asesor, asesor_client):
          self.primernombre_asesor = primernombre_asesor
          self.apellido_asesor = apellido_asesor
          self.correo_asesor = correo_asesor
          self.asesor_client = asesor_client
  
  </code></pre>
  <p>My Views</p>
  <pre><code>@app.route('/cotizacion/crear/&lt;int:id&gt;', methods=(&quot;GET&quot;, &quot;POST&quot;))
  @login_required
  def crearcotizacion(id):
      
  
      datos_solicitud = (db.session.query(Solicitud).filter_by(id=id).first())
      
      datos_clientes = datos_solicitud.sol_client
      
      datos_servicio = (db.session.query(Solicitud, Servicio.costo_servicio).join(Servicio).filter_by(id=id).first())
      print(datos_servicio)
  
      
      form = creacion_Cotizacion(request.form)
  
  
      if current_user.role == True:
          
          
          if request.method == 'POST':
  
              cotizan = Cotizacion(
             
              numero_horas=form.numero_horas.data,
              descuento=form.descuento.data,
              
              clientes_cotizan=datos_clientes,
              clientes_solicitan=datos_solicitud,
              clientes_servicios=datos_solicitud
              
              )
              
              db.session.add(cotizan)
              db.session.commit()
              flash('La cotización ha sido creado exitosamente', 'success')
              return render_template('crearcotizacion.html', form=form, id=id, datos_solicitud=datos_solicitud, datos_clientes=datos_clientes, datos_servicio=datos_servicio)
              
      else:
          abort(401)
  
      return render_template('crearcotizacion.html', nombres=current_user.nombres, correo=current_user.correo, role=current_user.role, id=id, form=form, datos_solicitud=datos_solicitud, datos_clientes=datos_clientes, datos_servicio=datos_servicio)
  
  
  
  @app.route('/crearsolicitudes/crear/&lt;int:id&gt;', methods=(&quot;GET&quot;, &quot;POST&quot;))
  @login_required
  def crearsolicitud(id):
      
      client = (db.session.query(Clientes).filter_by(id=id).one())
      form = form_solicitudes(request.form)
      datos_solicitud = (db.session.query(Solicitud).filter_by(id=id).first())
  
      if current_user.role == True:
          
          if request.method == 'POST':
              
  
              solicitan = Solicitud(
                
                  servicio_campo = form.servicio_campo.data,
                  asesore = form.asesore.data,
                  sol_client = client,
                  clientes_servicios=datos_solicitud
               
                  )
              
              db.session.add(solicitan)
              db.session.commit()
              message = f&quot;La solicitud {solicitan.id} ha sido creada exitosamente&quot;
              flash(message, 'success')
              return redirect(url_for('versolicitudes', client=client, id=id, form=form, nombres=current_user.nombres, correo=current_user.correo, role=current_user.role,))
              
      else:
          abort(401)
  
      return render_template('crearsolicitudes.html', nombres=current_user.nombres, correo=current_user.correo, role=current_user.role, id=id, client=client, form=form)
  
  @app.route('/crearcliente', methods=(&quot;GET&quot;, &quot;POST&quot;))
  @login_required
  def crearcliente():
      clint = db.session.query(Clientes).filter_by(id=id).first()
      form = creacion_Cliente(request.form)
      client= Clientes(
              nombres=form.nombres.data,
              apellidos=form.apellidos.data,
              correo=form.correo.data,
              empresa=form.empresa.data,
              celular=form.celular.data,
              mensaje = form.mensaje.data,
              checkbox = form.checkbox.data,
              sol_client = clint,
              clientes_servicios = clint)
  
  
      if current_user.role == True:
          if request.method == 'POST':
              db.session.add(client)
              db.session.commit()
              message = f&quot;El cliente {client.nombres} {client.apellidos} ha sido creado exitosamente&quot;
              flash(message, 'success')
              return redirect(url_for('listarclientes', form=form))
            
      else:
          abort(401)
  
      return render_template('crearcliente.html', form=form, nombres=current_user.nombres, correo=current_user.correo, role=current_user.role)
  
  @app.route('/ver-solicitudes')
  @login_required
  def versolicitudes():
      if current_user.role == True:
          clientes= db.session.query(Solicitud.id, Solicitud.servicio_campo, Solicitud.asesore, Clientes.nombres, Clientes.apellidos, Clientes.correo, Clientes.empresa, Clientes.mensaje, Clientes.celular).join(Clientes).all()
          return render_template('listacotizacion.html', clientes=clientes, nombres=current_user.nombres, correo=current_user.correo)
  </code></pre>