【问题标题】:Flask SQLAlchemy query information in many to many relationshipFlask SQLAlchemy 在多对多关系中查询信息
【发布时间】:2021-08-28 11:16:51
【问题描述】:

我想查询由我的 order_id 过滤的数据库并访问 category_name 的信息。

我已尝试阅读多个答案,例如this one,但我无法完全达到我想去的地方。我有一个模型,例如:

models.py

product_category_table = db.Table('prouct_to_category_association',
db.Column('product_id', db.Integer, db.ForeignKey('product.id')),
db.Column('category_id', db.Integer, db.ForeignKey('category.id')))

class Category(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(120), index=True)
    risks = db.relationship("Product", 
                        secondary=product_category_table,
                        back_populates="categories")

class Product(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    order_id = db.Column(db.Integer, db.ForeignKey('Order.id'))
    product_value = db.Column(db.Float(1,2), index=True)
    categories = db.relationship("Category", 
                             secondary=risk_category_table,
                             back_populates="risks")

我现有的查询如下所示:

products = Product.query.filter_by(order_id = 1).all()

当我想访问我正在使用的信息时(Jinja2 格式):

{% for product in products %}
cat = {{product.categories}}, val={{product.product_value}}
{% endfor %}

这让我可以打印:

cat = [1], val = 5.99, cat = [2], val = 6.55, and so on...

但是,我不知道如何不仅可以访问category.id,还可以访问实际的category.name...我明白为什么我会得到它category.id(来自关联表)。

问题

  1. 如何更新我的查询,以便返回包含此信息?
  2. 如何在 Jinja 中引用它?

【问题讨论】:

  • 奇怪的是你只收到category.id,因为你的关系定义(product.category)实际上应该返回Category实例的列表。
  • @van 可能是我搞砸了如何在 Jinja 中引用...如果我 product.categories 我得到了 ID,但如果我尝试 product.categories.name 我什么也得不到。这是正确的方法吗
  • 您应该能够通过product.categories 循环通过另一个嵌套循环,例如{% for category in product.categories %} cat = {{category.name}} {% endfor %}
  • @van,嵌套循环就是答案。它也在提供类别信息。谢谢!

标签: python flask sqlalchemy jinja2 flask-sqlalchemy


【解决方案1】:

你可以在分类表中做backref

risks = db.relationship("Product", 
                    secondary=product_category_table,
                    back_populates="categories",backref=db.backref('cat'))

在 jinja2 中使用 product.cat.nameproduct.cat.risks 访问它 使用 backref 后,您可以访问 Categories 的所有行

【讨论】:

  • SO 会抛出一个错误,指出 back_populates 和 backref 是互斥的。如果我更改为 backref,它会说“关系 'Product.categories' 会将列 product.id 复制到列 product_to_category association.product id,这与关系 Product.category 冲突。
  • 尝试从Product中删除categories
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 2019-01-12
  • 2016-06-15
相关资源
最近更新 更多