flask-sqlalchemy - 使用 Flask-SQLAlchemy 如何在 jinja 模板助手上检索多对多表额外字段

标签 flask-sqlalchemy

使用 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/

相关文章:

python - sqlalchemy 一对多加入 Flask 应用程序以获得最大日期

python - 通过 Flask SQLAlchemy 从 SQLite 读取 BLOB (LargeBinary) 返回 None

sql - SQLAlchemy 中的多对多查询非常慢

用户 root@localhost 的 mysql 访问被拒绝(使用密码 : NO) despite having set a password and entered it in connection uri

flask-sqlalchemy - 数据库问题“无法从字符串中解析 rfc1738 URL”

python - SQLAlchemy 中的 GroupBy 和 Sum?

python - 如何在 SQLAlchemy 中的文本数组列上创建 GIN 索引(使用 PostgreSQL 和 python)

python - Flask-SQLAlchemy:既没有设置 SQLALCHEMY_DATABASE_URI 也没有设置 SQLALCHEMY_BINDS。默认 SQLALCHEMY_DATABASE_URI 为 "sqlite:///:memory:"

python - flask-sqlalchemy 中两个表之间的关系,一个有 2 个外键

python - 如何使用棉花糖序列化自定义 sqlalchemy 字段?