模型与Python中filter_by错误之间的关系



我目前正在学习Python。我有一个应用程序,有两个类-客户和订单。我想显示一个页面,显示与一个客户关联的所有订单(多对一关系)。我相信我已经正确地定义了关系,但是我得到了一些错误。

models.py

from app import db, ma
class customer(db.model):
__tablename__="customer"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(120))
orders = relationship("order", back_populates="customer")
def __repr__(self):
return '<customer %r' % self.id
class order(db.Model):
__tablename_="order"
id = db.Column(db.Integer, primary_key=True)
customer_id = db.Column(db.Integer, db.ForeignKey("customer.id"))
content = db.Column(db.String(120))
customer = relationship("customer")
def __repr__(self):
return '<order %r' % self.id`

routes.py

from app import app
from flask import Flask, render_template, request, redirect
from app.models import *
@app.route('/orders/<customer>')
def show_orders(name):
orders = order.query.join(customer, customer.id==order.customer_id).filter_by(customer.name==name).all()
return render_template('orders.html', name=name)

例如,如果我输入'orders/bob_smith',这个页面应该会显示数据库中bob_smith的所有订单。

但是当我尝试运行这个时,我得到以下错误:

TypeError: filter_by() takes 1 positional argument but 2 were given.

我做错了什么模型吗?或者我没有在filter_by中分配正确的变量?非常感谢任何帮助!

编辑:经过一些建议,我对routes.py做了如下修改
@app.route('/orders/<customer>')
def show_orders(name):
orders = order.query.join(customer, customer.id==order.customer_id).filter_by(customer.name==customer.name).all()
return render_template('orders.html', name=name)

我可以看到orders/bob_smith,但不是只显示bob_smith的订单,我看到了数据库中的所有订单。

orders.html

{{ name }} Orders
{% for order in orders %}
{{ order.customer }} # should all be bob_smith
{{ order.content }}

但是,我看到的是所有订单的列表。我是否没有充分限制查询?

只是一些小更新:

@app.route('/orders/<customer_name>')
def show_orders(customer_name):
orders = order.query.join(customer, customer.id==order.customer_id).filter(customer.name==customer_name).all()
return render_template('orders.html', orders=orders)

order.html需要有:


{% for order in orders %}
{{ order.customer }}
{{ order.content }}

{% endfor %}

最新更新