如何使用连接表进行连接?

时间:2017-10-25 10:55:46

标签: python postgresql sqlalchemy flask-sqlalchemy

我有4个表,VendorProductsProductGroupings以及一个名为Products_ProductGroupings的联接表。我正在尝试查询所有ProductGroupings加入Products加注Products_ProductGroupings Products.vendor == <A Vendor Instance>

我不能做的是找到与连接表一起使用的正确语法。

或者,由于ProductGroupings有一个名为products的媒体资源,因此我想查询ProductGroupings products vendor <A Vendor Instance> class Products(db.Model): __tablename__ = 'products' id = db.Column(db.Integer, primary_key=True) parent_id = db.Column(db.Integer, db.ForeignKey('products.id')) parent = db.relationship('Products', backref='children', remote_side=[id]) groupings = db.relationship('ProductGroupings', secondary=Products_ProductGroupings, backref='products') class ProductGroupings(db.Model): __tablename__ = 'product_groupings' id = db.Column(db.Integer, primary_key=True) date_created = db.Column(db.DateTime(timezone=True), nullable=False, default=datetime.datetime.now) Products_ProductGroupings = db.Table( 'products_product_groupings', db.Column('product_id', db.Integer, db.ForeignKey('products.id')), db.Column('product_grouping_id', db.Integer, db.ForeignKey('product_groupings.id')) ) class Vendors(db.Model): __tablename__ = 'vendors' id = db.Column(db.Integer, primary_key=True) hash = db.Column(db.Text(10), nullable=False, default=create_hash) vendor_id = db.Column(db.Integer, db.ForeignKey(Vendors.id), nullable=False) vendor = db.relationship(Vendors, backref='products', foreign_keys=[vendor_id]) 的所有anchorPane

15px

1 个答案:

答案 0 :(得分:1)

您可以简单地加入ORM关系:

db.session.query(ProductGroupings).\
    join(ProductGroupings.products).\
    filter(Products.vendor == v)

或者Query.join()接受一个连接点作为第二个参数:

db.session.query(ProductGroupings).\
    join(Products, ProductGroupings.products).\
    filter(Products.vendor == v)

请注意,多对多关系最终可能会为单个ProductGroupings实体生成多行,但在查询单个实体时这不可见。你也可以filter on EXISTS

db.session.query(ProductGroupings).\
    filter(ProductGroupings.products.any(Products.vendor == v))