【问题标题】:Accessing SQLAlchemy relationship data from Jinja从 Jinja 访问 SQLAlchemy 关系数据
【发布时间】:2018-01-18 11:59:57
【问题描述】:

我正在尝试从相关的数据库表中访问数据并在前端的某些表中显示该数据,但很难做到这一点。这是我目前拥有的(简化为重要代码)。

数据库模型:

class Client(Base):
    __tablename__ = 'Client'
    id = db.Column(db.Integer, primary_key=True)
    clientname = db.Column(db.String(50), unique=True, nullable=False)
    provider = db.Column(db.Boolean, default=False)
    sessions = db.relationship('Session', backref='client')
    contacts = db.relationship('Contact', backref='client')
    region_id = db.Column(db.Integer, db.ForeignKey('Region.region_name'),
            nullable=False)

class Contact(Base):
    __tablename__ = 'Contact'
    id = db.Column(db.Integer, primary_key=True)
    contact_name = db.Column(db.String(50), nullable=False)
    contact_phone = db.Column(db.String(50), nullable=False)
    contact_email = db.Column(db.String(50), nullable=False)
    client_id = db.Column(db.Integer, db.ForeignKey('Client.clientname'),
            nullable=False)

然后是我的包含 Jinja 模板的表格:

<tbody>
      {% for item in client_details %}
          <tr>
         <td>{{ item.clientname }}</td>
         <td>{{ item.contacts.contact_name }}</td>
          </tr>
       {% endfor %}
</tbody>

我传递给我的 render_template 的查询:

session_details = Session.query.all()
return render_template('tables.session.html', session_details=session_details, passing_alert=passing_alert)

但我无法访问 Contact.contact_name。谁能指出我正确的方向?

【问题讨论】:

  • contacts 属性 ClientContact 对象的集合。您必须以一种或另一种方式在模板中对其进行迭代。您的查询似乎与示例的其余部分无关。

标签: python sqlalchemy jinja2


【解决方案1】:

这就是答案:

根据@Ilja Everilä 的评论,由于您使用的是 1:n 关系,因此 Client 的联系人属性是联系人对象的集合,您需要像这样对其进行迭代:

<tbody>
      {% for item in client_details %}
          <tr>
         <td>{{ item.client_name }}</td>
         {% for contact in item.contacts %}
         <td>{{ contact.contact_name }}</td>
         {% endfor %}
          </tr>
       {% endfor %}
</tbody>

你可以像这样渲染你的模板:

def show_infos():
    client_details = Client.query.all()
    return render_template('index.html', client_details=client_details)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    相关资源
    最近更新 更多