我正在尝试通过Flask-SQLAlchemy查询显示来自MySQL的数据,并将外键(category_id)更改为分配给category_id的名称。 更确切地说 - {{link1:}}
使用查询,我想显示具有来自类别表的名称的项目,而不是category_id。
这是我的代码:
class MyEnum(enum.Enum):
piece = "piece"
kg = "kg"
class Category(db.Model):
__tablename__ = 'category'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(25), nullable=False)
class Product(db.Model):
__tablename__ = 'product'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30), nullable=False)
quantity = db.Column(db.Integer, nullable=False)
product_type = db.Column(db.Enum(MyEnum), nullable=False)
category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
description = db.Column(db.String(255))
category = db.relationship("Categ{{user.id}}ory",
backref=('products'))
def __init__(self,name, quantity, product_type, category_id, description):
self.name = name
self.quantity = quantity
self.product_type = product_type
self.category_id = category_id
self.description = description
db.create_all()
db.session.commit()
@app.route('/grocery-list', methods=['GET'])
def display_data():
data = Product.query.all()
category_name = db.session.query(Product).join(Category, Product.category_id == Category.name)
return render_template('query_database.html', data=data, category_name = category_name)
#query_database.html
<body>
{% for user in data %}
<li>{{user.id}}. {{user.name}} {{user.quantity}} {{user.product_type}} Category {{user.category_id}} {{user.description}}</li>
{% endfor %}
{{ category_name }}
</body>
query_Database.html的结果:
3. Ziemniaczki 2 MyEnum.kg Category 1 Na obiad
SELECT product.id AS product_id, product.name AS
product_name,product.quantity AS product_quantity, product.product_type AS product_product_type, product.category_id AS product_category_id,
product.description AS product_description FROM product INNER JOIN category ON product.category_id = category.name
问题:
1)如何创建这样的查询?我已经了解了在纯SQL中应该如何编写,但在SqlAlchemy文档中找不到相应的等效方法:
select p.name, c.name
from product as p
join category as c
on c.id = p.category_id
2) MyEnum.kg在那里做什么?如何从此视图中删除My.Enum?
编辑 - 成功
如果有人需要,就把工作代码留下来。
@app.route('/grocery-list', methods=['GET'])
def display_data():
data = db.session.query(Product, Category).join(Category).all()
return render_template('query_database.html', data=data)
{% for user, category in data %}
<li>{{user.id}}. {{user.name}} {{user.quantity}} {{user.product_type}} Category {{user.category.name}} {{user.description}}</li>
{% endfor %}
解决方案
在连接表之后,在模板文件中需要使用
{{ category.name }}
来解包类别名称的值。
{{user.category.name}}
Product.category_id == Category.name
(将整数列与文本列进行比较)实现什么吗? - Ilja EveriläProduct.category_id
为Category.name
的解决方案。我不是为了显示数字而编写代码,而是将category
表中的Category.name
分配给这个数字。 - michael93pl