2015-03-24 55 views
4

假設我們有這三種模型。是否有可能使用peewee python ORM在幾個字段上進行sql連接?

class Item(BaseModel): 
    title = CharField() 

class User(BaseModel): 
    name = CharField() 

class UserAnswer(BaseModel): 
    user = ForeignKeyField(User, 'user_answers') 
    item = ForeignKeyField(Item, 'user_answers_items') 
    answer = ForeignKeyField(Item, 'user_answers') 

我想所有Items不具有對當前用戶相關UserAnswer記錄。在SQL它會是這樣的:

select * from item i 
left join useranswer ua on ua.item_id=i.id and ua.user_id=1 
where ua.id is null; 

是否有可能使一個左外與約束的加入使用peewee語法兩個領域?這將是冷靜,如果我可以這樣做:

Item.select().join(UserAnswer, JOIN_LEFT_OUTER, on=['__my_constraints_here__']).where(
    (UserAnswer.id.is_null(True)) 
) 

回答

4

是的,你可以加入多個條件:

join_cond = (
    (UserAnswer.item == Item) & 
    (UserAnswer.user == 1)) 
query = (Item 
     .select() 
     .join(
      UserAnswer, 
      JOIN_LEFT_OUTER, 
      on=join_cond)) 
     .where(UserAnswer.id.is_null(True))) 

文檔瀏覽:http://docs.peewee-orm.com/en/latest/peewee/api.html#Query.join

對不起沒有的一個例子使用多個連接條件,但on只是一個任意表達式,因此您可以在其中放置任何有效的peewee「Expression」。

+0

感謝您的回答@coleifer。我嘗試了你的建議,但是我得到一個錯誤。 Peewee在這種連接條件下生成錯誤的sql – 2015-03-28 22:10:34

+0

它使這個sql'SELECT't1'。'id','t1'。'description'FROM'item'AS t1 LEFT OUTER JOIN'useranswer'AS t2 ON(('t2' ('t2'。'id'IS%s)[1,None]'.'item_id'='item'AS t1)AND('t2'。'user_id'=%s))。它在on子句中有一個錯誤ON((''t2'。'item_id'='item'AS t1)'。它必須是'ON((''''''item_id'='t1'。'id')。 '。我必須做些什麼才能使它工作?) – 2015-03-28 22:19:32

+0

然後讓它成爲'(UserAnswer.id == 1)'而不是'(UserAnswer.user == 1)'。我敢打賭,如果你看着它並思考它你已經能夠弄清楚了! – coleifer 2015-03-30 00:03:27

相關問題