Compound searches
One way to accomplish the "posts without badtag" might be:

``` python
(Post
 .select()
 .where(~fn.EXISTS(
      Tag.select().where(
          (Tag.post == Post.id) & (Tag.name == 'BadTag'))))
```

Another might be:

``` python
(Post
 .select(Post, fn.COUNT(Tag.id))
 .join(Tag, JOIN.LEFT_OUTER)
 .where(Tag.name == 'BadTag')
 .group_by(Post)
 .having(fn.COUNT(Tag.id) == 0))
```

I didn't test these examples, but hopefully you get the idea.

```
select * from post t1
where not exists
(select 1 from tag t2
   where t1.id == t2.post_id and t2.name=='BadTag');
```

finds all posts which haven't any associated tags named 'BadTag'.

Is there a way to do this naturally in Peewee?

```
Post.select().where(
    ~Tag.select()
    .where(Post.id == Tag.post & Tag.name=='BadTag')
    .exists()
)
```

gets compiled to
`SELECT "t1"."id", ... FROM "post" AS t1 WHERE ? [-1]`
and
`Post.select().join(Tag).where(Tag.name!='BadTag')`
doesn't work since a Post can have many Tags.

I can use `Post.raw()` but then can't do things like `.order_by()`
