我在 Categories 和 Products 之间有一个多对多的关系,如下所示:
category_product = db.Table('category_product',
db.Column('category_id',
db.Integer,
db.ForeignKey('category.id')),
db.Column('product_id',
db.Integer,
db.ForeignKey('product.id')))
class Product(db.Model):
""" SQLAlchemy Product Model """
id = db.Column(db.Integer, primary_key=True)
sku = db.Column(db.String(10), unique=True, nullable=False)
name = db.Column(db.String(80), nullable=False)
categories = db.relationship('Category', secondary=category_product,
backref=db.backref('categories',
lazy='dynamic'))
def __init__(self, name):
self.name = name
def __repr__(self):
return '<Product {}>'.format(self.name)
class Category(db.Model):
""" SQLAlchemy Category Model """
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False)
products = db.relationship('Product', secondary=category_product,
backref=db.backref('products', lazy='dynamic'))
def __init__(self, name):
self.name = name
def __repr__(self):
return '<Category {}>'.format(self.name)
我正在尝试获取给定 Category
中的所有 Product
对象,由 category_id
指定:
products = db.session.query(Category).\
filter_by(id=category_id).\
products.\
all()
但是,我得到以下异常:
AttributeError: 'Query' object has no attribute 'products'
我可能遗漏了一些简单的东西。
最佳答案
您不能使用属性名称“products”跟随 filter_by。您首先需要使用 all() 或 first() 捕获结果。另外,由于您使用的是 Flask-SQLAlchemy,因此我建议不要使用 db.session.query(Category) 而是使用 Category.query。所以改变这个
products = db.session.query(Category).\
filter_by(id=category_id).\
products.\
all()
到
all_products = Category.query.\
filter_by(id=category_id).\
first().\
products
关于python - Flask-SQLAlchemy 查询多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19436020/