Flask / SQLAlchemy-请求具有多对多关系的表

时间:2019-03-18 11:23:06

标签: python sqlalchemy

我用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'

你能帮我吗?谢谢!

1 个答案:

答案 0 :(得分:1)

在我的一个项目中,我具有类似的结构,这就是我定义relatioship的方式:

leagues = db.relationship("League", 
                          secondary=LeagueTeamAssociation.__tablename__,
                          back_populates="teams")

因此,您需要使用上述语法(您需要在secondary类中添加__tablename__)或使用字符串“ has_tag”为HasTag参数提供表名(前提是这是数据库中表的名称)。