2015-03-24 56 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

相关问题