是否可以使用peewee python ORM在几个字段上进行sql连接?

时间:2015-03-24 22:55:42

标签: python peewee

假设我们有这三种模式。

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))
)

1 个答案:

答案 0 :(得分:5)

是的,您可以加入多个条件:

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”放在那里。