我的设置如下:
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
,因为它是属性,而不是列。
有办法解决这个问题吗?
答案 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