如何使用flask-sqlalchemy和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并选择一个客户时,我添加报价值的第二页,当创建报价按钮被点击时,出现错误,我不知道如何解决这个问题:报价已经存在。另外,我不知道外键是如何填充的。谢谢你的帮助。

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

client = (db.session.query(Clientes).filter_by(id=id).one())
cotizan = Cotizacion(
numero_personas=form.numero_personas.data,
...,
clientes_cotizan = client
)

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

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

最新更新