Flask-SQLAlchemy查询多对多

时间:2013-10-17 19:55:22

标签: python sqlalchemy flask flask-sqlalchemy

我在类别和产品之间有多对多的关系,如下所示:

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)

我正在尝试获取由Product指定的给定Category中的所有category_id个对象:

products = db.session.query(Category).\
        filter_by(id=category_id).\
        products.\
        all()

但是,我得到以下例外:

AttributeError: 'Query' object has no attribute 'products'

我可能错过了一些简单的事情。

2 个答案:

答案 0 :(得分:4)

您无法使用属性名称“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

答案 1 :(得分:0)

针对需要...的人

您可以使用.any()

product = Product.query.filter(Category.products.any(id=cat_id)).all()

我没有测试查询。但我认为这是可行的... 编码愉快...