Dev*_*sta 2 flask python-3.x flask-sqlalchemy
我目前正在使用 Flask 和 SQLAlchemy 进行一个项目,基本上是像 discourse 这样的论坛软件,但使用的是 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 %}
Run Code Online (Sandbox Code Playgroud)
这由以下视图调用(稍微简化)。
@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)
Run Code Online (Sandbox Code Playgroud)
但是,每次我尝试运行它时,都会收到错误“jinja2.exceptions.UndefinedError: 'TagID' is undefined”。
我试过用{% for thread in Forum.ForumThreads.filter_by(TagID=1): %}运行它,它似乎运行良好,所以我的问题似乎在于我如何调用 .in_() 方法。我已经搜索了 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'})
Run Code Online (Sandbox Code Playgroud)
TagID未定义,因为它不能直接访问。它是您Thread模型的一部分。您需要通过Thread才能引用它:Thread.TagID。
但是,一旦您纠正了这一点,您很可能会遇到TypeError. filter_by接受关键字参数,而不是位置参数。为了过滤 using in_,您需要使用filter方法。filter_by接受关键字参数并基于此构建过滤器。
SomeModel.query.filter_by(a=1, b=2)
Run Code Online (Sandbox Code Playgroud)
将大致翻译为
SELECT * FROM somemodel WHERE a = 1 AND b = 2
Run Code Online (Sandbox Code Playgroud)
filter,另一方面,接受表达式(类型BinaryExpression)作为参数。上面的查询将表示为
SomeModel.query.filter(SomeModel.a == 1, SomeModel.b == 2)
Run Code Online (Sandbox Code Playgroud)
在这里,SomeModel.a是一个InstrumentedAttribute. InstrumentedAttribute对象拥有允许您执行比相等更复杂的比较的方法。
SomeModel.query.filter(SomeModel.a.in_((1, 2)))
Run Code Online (Sandbox Code Playgroud)
将大致翻译为
SELECT * FROM somemodel WHERE a IN (1, 2)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5605 次 |
| 最近记录: |