Flask SQLAlchemy - 访问没有列名的记录数据

时间:2017-09-12 09:39:24

标签: python sqlalchemy

长时间读者,第一次问问。我有点不确定如何表达我想要完成的事情。使用FlaskSQLAlchemy,我试图将记录(在本例中为system.xxx)中的数据放入表中。当我使用system.xxx时,我也会得到列名,如下图所示:

what I don't want

这是我在我的jinja模板中使用的代码:

{% block page_content %}
<div class="page-header">
    <h1>{{ system.serial }}</h1>
</div>
<hr width="80%">
<table class="table", border="5">
    <tr>
        <th>Status</th>
        <th>Assignee</th>
    </tr>
    <tr>
        <td>{{ system.status }}</td>
        <td>{{ system.assignee }}</td>
    </tr>
</table>
{% endblock %}

如何在未获得&{39; system.xxx&#39;的情况下访问Status u或者&#39; Assignee u&#39;栏目信息?我花了几个小时在互联网上试图解决这个问题,但我不知道如何正确地表达这个问题。

补充:烧瓶视图。

@main.route('/system/<serial>', methods=['GET'])
def system(serial):
    system = System.query.filter_by(serial=serial).first_or_404()
    return render_template('system.html', system=system)

补充:有问题的模型

#table of individual systems
class System(db.Model):
    __tablename__ = 'systems'
    id = db.Column(db.Integer, primary_key=True)
    serial = db.Column(db.String(64))
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    status_id = db.Column(db.Integer, db.ForeignKey('statuses.id'))
    assignee_id = db.Column(db.Integer, db.ForeignKey('assignees.id'))
    admin = db.Column(db.String)

    def __repr__(self):
        return '<System %r>' % self.serial

#table of assignees
class Assignee(UserMixin, db.Model):
    __tablename__ = 'assignees'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    email = db.Column(db.String(64), unique=True, index=True)
    systems = db.relationship('System', backref='assignee', lazy='dynamic')

    def __repr__(self):
        return '<Assignee %r>' % self.name

#table of status options
class Status(db.Model):
    __tablename__ = 'statuses'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    systems = db.relationship('System', backref='status', lazy='dynamic')

    @staticmethod
    def insert_statuses():
        statuses = ['Available', 'Loaned', 'Scrapped']
        for status in statuses:
            s = Status(name=status)
            db.session.add(s)
        db.session.commit()

    def __repr__(self):
        return '<Status %r>' % self.name

2 个答案:

答案 0 :(得分:1)

我认为您通过模板中的relationship属性访问了相关的StatusAssignee对象,然后使用string representation呈现它们。相反,您应该访问要显示的属性:

        <td>{{ system.status.name }}</td>
        <td>{{ system.assignee.name }} {{ system.assignee.email }}</td>

由于您始终会访问这些关系,因此您应该考虑加载它们。

答案 1 :(得分:0)

您可以显式查询所需的列。

first_result = session.query(System.xxx).filter(System.serial == serial).scalar()

您可能还希望使用one_or_none()one()all(),具体取决于您的使用案例。