If 语句始终为真 Jinja2 模板

If statement always True Jinja2 Template

我不确定到底是什么问题,但概念是当我的函数执行时它应该从数据库中获取一个查询列表,如果它不包含任何对象它应该 return False 和其他部分应该执行

第一部分有效,但即使我的数据库为空,它也通过了 True,

{% if new_bookmarks %}
     <div id='newBookmarks'>
        {% for bm in new_bookmarks %}
            <a href='{{ bm.url }}'><span>{{ bm.user.username }}</span> 
            Added: {{ bm.url }} <span>{{ bm.description }}</span></a>
        {% endfor %}
    </div>
{% else %}
    <div>
        Something else
    </div>
{% endif %}

@app.route('/')
@app.route('/index')
def index():
    return render_template('index.html', new_bookmarks=Bookmark.newest(5))

class Bookmark(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    url = db.Column(db.Text, nullable=False)
    date = db.Column(db.DateTime, default=datetime.utcnow)
    description = db.Column(db.String(300))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

    @staticmethod
    def newest(num):
        return Bookmark.query.order_by(desc(Bookmark.date)).limit(num)

问题是查询是惰性的,即,直到您开始迭代它才会执行。因此,在您测试其真实性时,它不知道其中有多少条记录。默认情况下,Python 中的大多数对象都是真实的,这也适用于查询。

要解决此问题,请使用:

return Bookmark.query.order_by(desc(Bookmark.date)).limit(num).all()

.all() 执行查询并将结果放入列表中。列表为空时是虚假的。由于这是一个小查询,因此一次性将所有结果存入内存的缺点很小。