python - Flask-SQLAlchemy 查询多对多

标签 python sqlalchemy flask flask-sqlalchemy

我在 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/

相关文章:

python - 在有很多记录的表中通过 random() 优化顺序

python - 类型错误 : Parse() argument 1 must be string or read-only buffer, 不是元组

html - 从 CSV/Flask 填充 Bootstrap 下拉按钮

python - 如何修复 ""属性错误: 'NoneType' object has no attribute 'app'

python - 我还是不明白内存观的意义

python - 在 Windows 中编译 .go ...& python 可以连接到 Go 吗?

javascript - 浏览器验证 - JavaScript [不广泛]

python - 如何从 PyQt5 中动态生成的复选框中删除标签?

python - 属性错误 : 'tuple' object has no attribute 'drivername' using Flask SqlAlchemy

python - 在 SQL-Alchemy 中选择父数据和子数据