错误 flask-sqlalchemy NameError: 全局名称 'joinedload' 未定义。

10

我试图使用sqlalchemy的加载策略来加快我的查询速度。在阅读这篇文章后,我意识到我犯了一个错误,即在模板中循环记录。唯一的问题是我得到了这个错误:

NameError: global name 'joinedload' is not defined.

这是因为我正在使用flask-sqlalchemy还是我忘记导入某些东西了吗?

Models.py:

inspection_violations = db.Table('inspection_violations',
db.Column('violation_id', db.Integer, db.ForeignKey('violations.violation_number')),
db.Column('inspection_id', db.Integer, db.ForeignKey('inspection.inspection_id')), )

class Inspection(db.Model):
    inspection_id = db.Column(db.Integer, primary_key=True)
    violations = db.relationship('Violations', secondary=inspection_violations, backref=db.backref('inspection', lazy='dinamic'))
    facility_id = db.Column(db.String(100), db.ForeignKey('facilities.branch_name'))

class Violations(db.Model):
    violation_number = db.Column(db.Integer, primary_key=True)
    details  = db.Column(db.Text)

违规蓝图:

@violations_blueprint.route('/violations/<int:violation_number>')
def show_single_violation(violation_number):
    violation = Violations.query.options(joinedload('inspection')).get(violation_number)
    return render_template('violations/single-violation.html' ,violation=violation)

模板:

{% for inspection in violation.inspection %} 
  <p><a href="{{ url_for('inspection_blueprint.show_inspection', id=inspection.inspection_id) }}">    {{ inspection.facilities.branch_name }}</a></p>
{% endfor %}

为了让我的模型更具参考价值,我有一个检查记录。每次检查都会有一个或多个违规行为,而每个违规行为都会有多次检查。

2个回答

21

好的,错误信息显示joinedload未定义,因此显而易见的解决方案是检查是否已导入它,如果没有 -

from sqlalchemy.orm import joinedload

嘿Bibhas,谢谢。我只是不确定它是否被导入了,或者从哪里导入,因为我正在使用flask扩展。 - Wilberto
flask-sqlalchemy 底层使用 sqlalchemy,因此您可以随时从中导入模块。 - Bibhas Debnath
@Bibhas 虽然你说的是正确的100%,但Flask-SQLAlchemy也将所有内容导入到db中,所以也可以使用它。 - jadkik94
谢谢,我现在知道即使我使用扩展名,它仍然可以以相同的方式导入。@jadikik94,你是对的,这就是为什么我会困惑从哪里导入的原因。 - Wilberto

0

就我的情况而言,这只是一个顺序问题

class Inspection(db.Model):

class Violations(db.Model):

inspection_violations = ()     //wrong junction table position 

这也不会起作用。因为当你使用 inspection_violations 时,它还没有被定义。并且也会报告相同的问题。

只需改变顺序即可使其正常工作。

inspection_violations = ()   //right junction table position

class Inspection(db.Model):

class Violations(db.Model):

这是正确的做法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接