SQLAlchemy:对关系使用like()()

时间:2015-07-21 16:31:57

标签: python sqlalchemy

我的设置如下:

class Name(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Text)

class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name_id = db.Column(db.Integer, db.ForeignKey('name.id'))

    _name = db.relationship('Name')

    @property
    def name(self):
        return self._name.name

调用Person.name会返回一个包含其实际名称的字符串,例如。

我正在构建基于此的RESTful API。我需要根据Person的名字允许使用通配符进行搜索。我正在寻找的功能是:

Person.query.filter(Person.name.like('Z%'))会选择Zack,Zed,Zoo等。但是,您无法在.like()上使用name,因为它是属性,而不是列。

有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

您的关系称为_name,因此您需要在查询中使用它。你想做这样的事情:

people = DBSession.query(Person)\
    .join(Person._name)\
    .filter(Name.name.like('Z%'))\
    .all()

# or more explicitly without using the relationship:

people = DBSession.query(Person)\
    .join(Name, Person.name_id == Name.id)\
    .filter(Name.name.like('Z%'))\
    .all()

顺便说一句,拥有一个Person类和一个Name类似乎有点奇怪......但是也许你的用例证明了这一点。

http://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html#querying-with-joins