gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:12:07 25 4
gpt4 key购买 nike

我目前正在使用 Flask 和 SQLAlchemy 开发一个项目,基本上是类似 discourse 的论坛软件,但使用 Python 3。

目前有两种模式,Forum和Threads

我有一个 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 %}

这由以下 View 调用(稍微简化)。

@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)

但是,每次我尝试运行它时,我都会收到错误“jinja2.exceptions.UndefinedError:‘TagID’未定义”。

我尝试使用 {% for thread in 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'})

最佳答案

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.a 是一个InstrumentedAttributeInstrumentedAttribute 对象拥有允许您执行比相等更复杂的比较的方法。

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

大致会翻译成

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

关于python-3.x - Flask-Sqlalchemy .in_() 方法对我不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25732222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com