繁体   English   中英

如何使用 flask-sqlalchemy 和 flask 将数据添加到具有一对多关系的两个表中

[英]How to add data into two tables with one to many relationship using flask-sqlalchemy and flask

伙计们,我是使用 Flask 和 flask-sqlalchemy 的新手。 我有两个表,一个用于存储客户数据,另一个用于存储报价值。 他们是一对多的关系,一个客户可以有多个报价单,但一个报价单只属于一个客户。

class Clientes(db.Model):
  
    __tablename__ = "clientes"


    id = db.Column(db.Integer, primary_key=True)
    servicios = db.Column(db.String(120), nullable=False)
    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', cascade='all, delete', backref='clientes_cotizan', lazy=True)

    def __init__(self, servicios, nombres, apellidos, correo, empresa, celular, mensaje, checkbox):
        self.servicios = servicios
        self.nombres = nombres
        self.apellidos = apellidos
        self.correo = correo
        self.empresa = empresa
        self.celular = celular
        self.mensaje = mensaje
        self.checkbox = checkbox
        
    

    def __repr__(self):
        return '<Clientes %r>' % self.id



class Cotizacion(db.Model):
    __tablename__ = "cotizacion"

    id = db.Column(db.Integer, primary_key=True)
    numero_personas = db.Column(db.Integer, nullable=False)
    valor_personas = db.Column(db.Integer, nullable=False)
    numero_horas = db.Column(db.Integer, nullable=False)
    valor_hora = db.Column(db.Integer, nullable=False)
    descuento = db.Column(db.Integer, nullable=False)

    # LLAVE FORANEA
    cliente_id = db.Column(db.Integer, db.ForeignKey("clientes.id"), nullable=False)
   

    def __init__(self, numero_personas, valor_personas, numero_horas, valor_hora, descuento, cliente_id):
        self.numero_personas = numero_personas
        self.valor_personas = valor_personas
        self.numero_horas = numero_horas
        self.valor_hora = valor_hora
        self.descuento = descuento
        self.cliente_id = cliente_id
       

    def __repr__(self):
        return '<Cotizacion %r>' % self.id


这是我的看法

@app.route('/cotizaciones/crear/<int:id>', methods=("GET", "POST"))
@login_required
def crearcotizacion(id):
    client = (db.session.query(Clientes).filter_by(id=id).one())
    
    form = creacion_Cotizacion(request.form)

    clientes_cotizan = db.session.query(Clientes, Cotizacion.id).join(Cotizacion).filter(Clientes.id).first()

    cotizan = Cotizacion(
         numero_personas=form.numero_personas.data,
         valor_personas=form.valor_personas.data,
         numero_horas=form.numero_horas.data,
         valor_hora=form.valor_hora.data,
         descuento=form.descuento.data,
         cliente_id = clientes_cotizan

     )

    if current_user.role == True:
        
        if request.method == 'POST':
           
            try:
                db.session.add(cotizan)
                db.session.commit()
                flash('La cotización ha sido creado exitosamente', 'success')
                return render_template('crearcotizacion.html', client=client, form=form, id=id)
            except InvalidRequestError:
                db.session.rollback()
                flash(f"Something went wrong!", "danger")

            except IntegrityError:
                db.session.rollback()
                flash(f"La Cotizacion ya existe!.", "warning")
            except DataError:
                db.session.rollback()
                flash(f"Entrada Inválida", "warning")
            except InterfaceError:
                db.session.rollback()
                flash(f"Error al conectarse a la base de datos", "danger")
            except DatabaseError:
                db.session.rollback()
                flash(f"Error de conexión con la base de datos", "danger")
            except BuildError:
                db.session.rollback()
                flash(f"Un error ha ocurrido!", "danger")
            else:
                abort(401)

    return render_template('crearcotizacion.html', nombres=current_user.nombres, correo=current_user.correo, role=current_user.role, id=id, client=client, form=form)

当我进入 /cotizaciones/crear/int:id 和 select 一个客户时,在我添加报价值的第二页,单击创建报价按钮时出现错误,我不知道如何解决此问题:报价已存在。 另外,我不知道如何填充外键。 感谢你的帮助。

当您创建Cotizacion object 时,您正在尝试填充外键列cliente_id 相反,您应该填充clientes_cotizan的反向引用。 它应该是这样的,其中clientes_cotizan由您使用所选 ID 查询的客户端 object 填充。

client = (db.session.query(Clientes).filter_by(id=id).one())

cotizan = Cotizacion(
     numero_personas=form.numero_personas.data,
     ...,
     clientes_cotizan = client

 )

请注意,您还需要编辑__init__ function 以接受此clientes_cotizan而不是cliente_id 它应该是这样的:

def __init__(self, numero_personas, ..., clientes_cotizan):
    self.numero_personas = numero_personas
    ...
    self.clientes_cotizan = clientes_cotizan

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM