使用 Flask SQLAlchemy,我尝试使用带有附加字段的辅助表来使用多对多关系。
模型定义:
prodord = db.Table('prodord',
db.Column('prod_id', db.Integer, db.ForeignKey('Product.id'), primary_key=True),
db.Column('order_id', db.Integer, db.ForeignKey('AOrder.id'), primary_key=True),
db.Column('quantity', db.Integer)
)
class Product(db.Model):
__tablename__ = 'Product'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
class User(db.Model):
__tablename__ = 'User'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
class AOrder(db.Model):
__tablename__ = 'AOrder'
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('User.id'))
timedate = db.Column(db.String)
products = db.relationship('Product', secondary=prodord, lazy='subquery',
backref=db.backref('orders', lazy=True))
调用模板:
@app.route('/orders')
def page_orders():
all_orders = AOrder.query.all()
return render_template('orders.html', orders=all_orders)
如何使用模板上的数量值? Product.quantity 为空,但 p.name 具有值:
{% for o in orders %}
<tr>
<td>{{o.timedate}}</td>
<td>
{% for p in o.products %}
{{p.quantity}} {{p.name}} <br />
{% endfor %}
</td>
</tr>
{% endfor %}
最佳答案
您已经使用关联表建立了关系,该表本质上成为产品模型和订单模型之间的透明链接。
由于您想在该链接表中存储额外的数据,因此您需要将其升级为关联对象,就像其他模型一样。
documentation goes into the detail关于如何做到这一点,这里有一个示例:
class Association(Base):
__tablename__ = 'association'
left_id = Column(Integer, ForeignKey('left.id'), primary_key=True)
right_id = Column(Integer, ForeignKey('right.id'), primary_key=True)
extra_data = Column(String(50))
child = relationship("Child", back_populates="parents")
parent = relationship("Parent", back_populates="children")
class Parent(Base):
__tablename__ = 'left'
id = Column(Integer, primary_key=True)
children = relationship("Association", back_populates="parent")
class Child(Base):
__tablename__ = 'right'
id = Column(Integer, primary_key=True)
parents = relationship("Association", back_populates="child")
关于flask-sqlalchemy - 使用 Flask-SQLAlchemy 如何在 jinja 模板助手上检索多对多表额外字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48931354/