2015-07-21 54 views
1

我有一个设置,看起来像这样: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等。但是,您不能在name上使用.like(),因为它是属性而不是列。

有没有办法解决这个问题?

回答

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类和一个名称类......但也许它是你的使用情况合理的。

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

+0

我得到'ProgrammingError:(psycopg2.ProgrammingError)操作符不存在:整数~~ *未知LINE 3:WHERE node.id ILIKE '' AND node.ipaddress ILIKE'和节点... 。^提示:没有操作符匹配给定的名称和参数类型。您可能需要添加明确的类型转换。“问题中的人员和姓名仅仅是一个例子。我不知道这里会发生什么问题。 –

+1

如果您发布实际/正在运行的代码的示例,它将有所帮助。 – Lee

+0

你可以使用关系做一个简单的查询吗?例如'... query(Person).join(Person._name).filter(Name.id == 1).all()' - 只是为了确保关系设置正确。 – Lee