2015-07-21 18 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