Flask:如何检查一对多backref

时间:2017-08-06 15:03:41

标签: python flask sqlalchemy jinja2 flask-sqlalchemy

以下两种模式:

class Comment(db.Model):
    __tablename__ = 'comments'
    id = db.Column(db.Integer, primary_key=True)
    author_id = db.Column(db.Integer, db.ForeignKey('users.id'))


class User(db.Model, UserMixin):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    comments = db.relationship('Comment', backref='author', lazy='dynamic')

user = User.query.get_or_404(id)

确保用户存在,并且尚未发布任何评论。

然后在模板文件中

{% if user.comments %}
    do stuff
{% else %}
    no comments yet
{% endif %}

if-else条件无法进入else分支。

如果我使用以下代码:

comments = Comment.query.filter_by(author_id=user.id).all()

{% if comments %}
    do stuff
{% else %}
    no comments yet
{% endif %}

可以输出

no comments yet

为什么user.com没有用?

1 个答案:

答案 0 :(得分:0)

很容易解释为当你写if user.comments时它总是为真,因为它不是无,即使是空的:

>>> user.comments
<sqlalchemy.orm.dynamic.AppenderBaseQuery object at 0x7fa6e0b456a0>
>>> user.comments.all()
[]

你看,即使查询什么都没有返回,它的类型也不是None,它是一个sqlalchemy对象:

>>> type(user.comments)
<class 'sqlalchemy.orm.dynamic.AppenderBaseQuery'>

也许您可以直接使用len()或用户user.comments.all()或更好:

{% if user.comments.count() > 0 %} 
do stuff
{% else %}
no comments yet 
{% endif %}