如何根据 Flask-SQLAlchemy 中的父 table 条目访问所有子 table 条目

How to access all the child table entries based on parent table entry in Flask-SQLAlchemy

我正在开发一个基于 flask 的网站,我在数据库中有两个表,Customer(PK=sno, ...)Item(PK=iid, ..., FK=customer.sno)。 我想在点击某个客户对应的账单按钮时,一次显示该客户对应的所有商品。

文件app.py包含代码

@app.route("/show_bill/<int:sno>")
def show_bill(sno):
    customer = Customer.query.filter_by(sno=sno).first()
    show_bill = Item.query.filter_by(cid=sno)
    return render_template('show_bill.html', customer=customer, show_bill=show_bill)

并且,show_bill.html包含

<div class="container my-3">
    <h2>Bill for customer {{ customer.cname }}</h2>
        {% if show_bill|length == 0 %}
            <div class="alert alert-dark" role="alert">
                No Item found. Add first Item now to appear for this customesr!
            </div>
        {% else %} 
            <table class="table">
                <thead>
                    <tr>
                    <th scope="col">SNo</th>
                    <th scope="col">Customer ID</th>
                    <th scope="col">Name of Item</th>
                    <th scope="col">No. of Items</th>
                    <th scope="col">Rate</th>
                    <th scope="col">Discount(%)</th>
                    <th scope="col">Time</th>
                    <th scope="col">Actions(Edit)</th>
                    </tr>
                </thead>
                        
                <tbody>
                {% for item in show_bill %}
                <tr>
                    <th scope="row">{{loop.index}}</th>
                    <td>{{item.cid}}</td>
                    <td>{{item.iname}}</td>
                    <td>{{item.icount}}</td>
                    <td>{{item.irate}}</td>
                    <td>{{item.idiscount}}</td>
                    <td>{{item.date_created}}</td>
                    <td>
                        <a href="/update_item/{{item.iid}}" type="button" class="btn btn-outline-dark btn-sm mx-1">Update</button>
                        <a href="/delete_item/{{item.iid}}" type="button" class="btn btn-outline-dark btn-sm mx-1">Delete</button>
                    </td>
                </tr>
                {% endfor %}
                </tbody>
            </table>
        {% endif %}
</div>

但是,在单击 Bill 按钮时,出现错误: TypeError: object of type 'BaseQuery' has no len() 此外,如果我删除 show_bill=show_bill,它会呈现到 show_bill.html 页面但不显示数据,因为我们没有获取任何数据(可能问题出在这里)。
有人可以帮助解决这个问题吗?或者任何其他方式来获得同样的东西。

提前致谢。

您需要将 .all() 查询添加到 return 您 table 中所有所需项目的列表,如下所示:

show_bill = Item.query.filter_by(cid=sno).all()

如果没有这一部分,SQL return将您的查询作为对象而不是可迭代列表。