这是我的模型:产品和标签具有多对多关系
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'
)
当我使用产品加入标签时。我得到错误:
类“sqlalchemy.exc.InvalidRequestError”:找不到要加入的 FROM 子句。尝试加入 ,但得到:找不到“product_tags”和“products”之间的任何外键关系。
这是我的加入代码:
avai_tags = Tag.query.join(Product).order_by(ProductTag.name)
我错过了什么吗?
请您参考如下方法:
首先,在您的产品表中,您的第二个外键需要属性引用表名“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')
)
然后在您的产品模型中,您希望准确引用适当模型的名称。将“ProductTag”更改为“标签”
tags=db.relationship('Tag', # 'ProductTag' <- This is a relationship to the Tag table.
secondary=products_tags_table,
backref='tag_products'
)
然后像这样尝试加入
query = Tag.query.join(Product, Tag.products)
avail_tags = query.order_by(Tag.name).all()
