SQLAlchemy多对多加入

Ngu*_* DT 1 python many-to-many join sqlalchemy flask

这是我的模型:产品和标签具有多对多关系

products_tags_table=db.Table('products_tags',
                        db.Column('product_id', db.Integer,db.ForeignKey('products.id'), nullable=False),
                        db.Column('tag_id',db.Integer,db.ForeignKey('tag.id'),nullable=False),
                        db.PrimaryKeyConstraint('product_id', 'tag_id')
                        )

class Tag(db.Model):
    __tablename__ = "tags"
    id = db.Column( db.Integer, primary_key = True)
    name = db.Column( db.String(256) )
    description = db.Column( db.Text() )
    background_img_url = db.Column( db.String(256) )
    products =db.relationship('Product',
                              secondary=products_tags_table,
                              backref='product_tags'
                             )  




class Product(db.Model):
    __tablename__ = "products"
    id = db.Column( db.Integer, primary_key = True)
    name = db.Column( db.String(256) )
    tags=db.relationship('ProductTag',
                        secondary=products_tags_table,
                        backref='tag_products'
                        )  
Run Code Online (Sandbox Code Playgroud)

当我加入Tag with Product时.我收到了错误:

class'narlalchemy.exc.InvalidRequestError':找不到要加入的FROM子句.尝试加入,但得到:找不到'product_tags'和'产品'之间的任何外键关系.

这是我的加入代码:

avai_tags = Tag.query.join(Product).order_by(ProductTag.name)
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

Try*_*ass 10

首先,在您的products表中,您的第二个外键需要属性引用表名"tags",因此将'tag.id'更改为'tags.id'

products_tags_table=db.Table('products_tags',
                    db.Column('product_id', db.Integer,db.ForeignKey('products.id'), nullable=False),
                    db.Column('tag_id',db.Integer,db.ForeignKey('tags.id'),nullable=False), 
                                                                   #^Missing 's'
                    db.PrimaryKeyConstraint('product_id', 'tag_id')
                    )
Run Code Online (Sandbox Code Playgroud)

然后在您的产品模型中,您希望准确地引用相应模型的名称.将'ProductTag'更改为'Tag'

tags=db.relationship('Tag', # 'ProductTag' <- This is a relationship to the Tag table.
                    secondary=products_tags_table,
                    backref='tag_products'
                    )  
Run Code Online (Sandbox Code Playgroud)

然后尝试这样的联接

query = Tag.query.join(Product, Tag.products)

avail_tags = query.order_by(Tag.name).all()
Run Code Online (Sandbox Code Playgroud)