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

Yar*_*huk 4 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')
Run Code Online (Sandbox Code Playgroud)

我想获得当前用户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;
Run Code Online (Sandbox Code Playgroud)

是否可以使用peewee语法在两个字段上使用约束进行左外连接?如果我能以这种方式做到这将是很酷的:

Item.select().join(UserAnswer, JOIN_LEFT_OUTER, on=['__my_constraints_here__']).where(
    (UserAnswer.id.is_null(True))
)
Run Code Online (Sandbox Code Playgroud)

col*_*fer 7

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

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)))
Run Code Online (Sandbox Code Playgroud)

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

抱歉,没有使用多个连接条件的示例,但这on只是一个任意表达式,因此您可以将任何有效的peewee"Expression"放在那里.