The documentation shows here how to use the IN
operator, but I couldn't find how to use the NOT IN
operator.
If I put a not <<
I get a syntax error.
If I put a not <FieldName> <<
there is a WHERE False
instead of a subquery like WHERE (<FieldName> NOT IN (SELECT ...
.
Here is the output with the documentation examples. The first one is correct, the second and third are wrong.
>>> 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
not in
is literally a single operator namednot in
, it doesn't mean you can putnot
before any other operator. The fact that Peewee reinterprets<<
to mean a SQLIN
doesn't mean it can change Python syntax. – Affiliate