我用Flask和SQLAlchemy创建了一个基于数据库的应用程序。这是我定义的类:
models.py
class HasTag(db.Model):
tagged_document_id = db.Column(db.Integer, db.ForeignKey('Document.id'), primary_key=True)
document_tag_id = db.Column(db.Integer, db.ForeignKey('Tag.id'), primary_key=True)
class Document(db.Model):
id = db.Column(db.Integer, unique=True, nullable=False, primary_key=True, autoincrement=True)
title = db.Column(db.Text)
tag = db.relationship("Tag",
secondary=HasTag,
back_populates="tagged_document",
lazy="dynamic")
class Tag(db.Model):
id = db.Column(db.Integer, unique=True, nullable=False, primary_key=True, autoincrement=True)
label = db.Column(db.String, nullable=False)
tagged_document = db.relationship("Document",
secondary=HasTag,
back_populates="tag",
lazy="dynamic")
在该应用程序中,我有一个高级搜索表单,可以在其中通过“文档”表的不同字段进行全文搜索。
routes.py
@app.route("/search")
def search():
keyword = request.args.get("keyword", None)
query = Document.query
if keyword:
query = Document.query.filter(or_(
Document.title.like("%{}%".format(keyword)),
...
))
问题是,我想也可以在标签的标签中搜索用户提供的关键字。我尝试过类似的事情:
if keyword:
query = Document.query.join(Tag).filter(or_(
Document.title.like("%{}%".format(keyword)),
...,
Tag.label.like("%{}%".format(keyword))
))
但我收到此错误:AttributeError: 'HasTag' object has no attribute 'foreign_keys'
你能帮我吗?谢谢!
答案 0 :(得分:1)
在我的一个项目中,我具有类似的结构,这就是我定义relatioship
的方式:
leagues = db.relationship("League",
secondary=LeagueTeamAssociation.__tablename__,
back_populates="teams")
因此,您需要使用上述语法(您需要在secondary
类中添加__tablename__
)或使用字符串“ has_tag”为HasTag
参数提供表名(前提是这是数据库中表的名称)。