文档显示here如何使用IN
运算符,但我无法找到如何使用NOT IN
运算符。
如果我输入not <<
,我会收到语法错误。
如果我添加not <FieldName> <<
,则会有WHERE False
而不是像WHERE (<FieldName> NOT IN (SELECT ...
这样的子查询。
以下是带有文档示例的输出。第一个是正确的,第二个和第三个是错误的。
>>> Tweet.select().where(Tweet.user << a_users).sql()
('SELECT t1."id", t1."user_id", t1."message", t1."created_date", t1."is_published" FROM "tweet" AS t1 WHERE (t1."user_id" IN (SELECT t2."id" FROM "user" AS t2 WHERE (Lower(Substr(t2."username", ?, ?)) = ?)))', [1, 1, 'a'])
>>> Tweet.select().where(not Tweet.user << a_users).sql()
('SELECT t1."id", t1."user_id", t1."message", t1."created_date", t1."is_published" FROM "tweet" AS t1 WHERE ?', [False])
>>> Tweet.select().where(Tweet.user not << a_users).sql()
SyntaxError: invalid syntax
答案 0 :(得分:20)
简单:
Tweet.select().where(Tweet.user.not_in(a_users))
对于稍微不同的语义(NOT(x in y))而不是(x NOT IN y):
Tweet.select().where(~(Tweet.user << a_users))
答案 1 :(得分:3)
我知道这是一个&#34; necro-posting&#34;,但这个问题首先在Google上针对peewee not in
查询,所以我想在此处添加:
您还可以使用doc:
中描述的not_in
方法
Tweet.select().where(Tweet.user.not_in(a_users))
就我而言,它看起来比~ ... <<
构建更具可读性。
答案 2 :(得分:1)
这与Peewee无关,真的。 Peewee正在使用一些Python运算符来实现自己的目的。 <<
通常是一个数字运算符,采用逻辑否定没有任何意义。因此not <<
永远不是有效的Python语法。
您的第二个示例已结束,但not
仅适用于Tweet.user
(优先级高于not
的{{1}})。添加一些括号,你得到:
<<
现在这仍然是不对的,正如您所发现的那样(读者:请参阅评论以进行一些讨论)。 Tweet.select().where(not (Tweet.user << a_users)).sql()
返回一个布尔值,这不是想要的,也不会起作用。为了这个,Peewee重新利用了not
运营商;看看@ coleifer的答案。