Flask-Sqlalchemy .in_()方法对我不起作用

时间:2014-09-08 20:01:15

标签: python-3.x flask flask-sqlalchemy

我目前正在与Flask和SQLAlchemy合作开发一个项目,基本上是论坛软件,比如话语,但是在Python 3中。

目前有两种模式,论坛和主题

我有一个应该生成论坛帖子的表记录的Jinja模板,请参阅下面的内容。

{% for thread in Forum.ForumThreads.filter_by(TagID.in_(TagsToShow)): %}
    <TR Class="ThreadRecord">
        <TD><a href="{{thread.ForumID}}/Thread/{{thread.ThreadID}}">{{thread.Title}}</a></TD>
        <TD class="ThreadTag{{thread.TagID}}">{{thread.Tag.Name}}</TD>
        <TD>{{thread.PostList.count()}}</TD>
        <TD>{{thread.User.Name}}</TD>
        <TD>{{thread.CreationDate}}</TD>
    </TR>
{% endfor %}

这可以通过以下视图调用(略微简化)。

@app.route('/Forum/<int:URLForumID>/ForumThreads')
    def ThreadsTable(URLForumID):
    TagsToShow = (1,2,3,4)
    Forum = models.Forum.query.filter_by(ForumID=URLForumID).first()
    return flask.render_template('ForumThreads.html', Forum=Forum, TagsToShow=TagsToShow)

但是,每次我尝试运行它时都会收到错误&#34; jinja2.exceptions.UndefinedError:&#39; TagID&#39;未定义&#34;。

我已经尝试使用 {%for thread for Forum.ForumThreads.filter_by(TagID = 1):%} 运行它,它似乎运行良好,所以我的问题似乎是在我如何调用.in_()方法。我已经通过documentation for SQLalchemy进行了搜索,但一直无法找到答案,是否有人能指出我正确的方向?

我不知道它是否有帮助,但下面是使用的SQLalchemy模型的两个精简版本。

class Forum(db.Model):
    __tablename__ = "Forum"
    ForumID = db.Column(db.Integer, primary_key=True)
    ForumName = db.Column(db.Unicode(20), unique=True, nullable=False)
    CreationDate = db.Column(db.DateTime, default=datetime.datetime.utcnow(), nullable=False)
    ForumThreads = db.relationship("Thread", backref="Forum", lazy='dynamic')
    __table_args__ = {'mysql_engine': 'InnoDB'}

class Thread(db.Model):
    __tablename__ = "Thread"
    ThreadID = db.Column(db.Integer, primary_key=True)
    ForumID = db.Column(db.Integer, db.ForeignKey("Forum.ForumID"), nullable=False)
    Title = db.Column(db.Unicode(100), nullable=False)
    UserID = db.Column(db.Integer, db.ForeignKey("User.UserID"), nullable=False)
    TagID = db.Column(db.Integer, db.ForeignKey("TagTypes.TagID"), nullable=False)
    CreationDate = db.Column(db.DateTime, default=datetime.datetime.utcnow(), nullable=False)
    __table_args__ = (db.ForeignKeyConstraint(['ForumID'], ['Forum.ForumID']),
                  db.ForeignKeyConstraint(['UserID'], ['User.UserID']),
                  db.ForeignKeyConstraint(['TagID'], ['TagTypes.TagID']),
                  {'mysql_engine': 'InnoDB'})

1 个答案:

答案 0 :(得分:4)

TagID未定义,因为它无法直接访问。它是Thread模型的一部分。您需要浏览Thread才能引用它:Thread.TagID

但是,一旦你纠正了这个问题,你很可能会遇到TypeErrorfilter_by接受关键字参数,而不是位置参数。要使用in_进行过滤,您需要使用filter方法。 filter_by接受关键字参数并根据该参数构建过滤器。

SomeModel.query.filter_by(a=1, b=2)

将粗略转换为

SELECT * FROM somemodel WHERE a = 1 AND b = 2
另一方面,

filter接受表达式(类型BinaryExpression)作为参数。上述查询将表示为

SomeModel.query.filter(SomeModel.a == 1, SomeModel.b == 2)

此处SomeModel.aInstrumentedAttributeInstrumentedAttribute个对象拥有允许您执行比较复杂的比较的方法。

SomeModel.query.filter(SomeModel.a.in_((1, 2)))

将粗略转换为

SELECT * FROM somemodel WHERE a IN (1, 2)