如何根据 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将您的查询作为对象而不是可迭代列表。
我正在开发一个基于 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将您的查询作为对象而不是可迭代列表。