LSMTable.get_by_id raises KeyError which breaks __contains__ functionality on ModelBase
You bring up a good point about having this be consistent with other models. I've removed the code which was raising the `KeyError` and updated the docs as well. It should behave the same as regular models now.
I have a scenario where I need to test for the presence of a key in a `LSMTable`. I noticed that `ModelBase` does support a `__contains__` method. So decided to do something like:
```
app_db = PooledSqliteExtDatabase(
        database=sqlite_db_filename,
        max_connections=500,
        pragmas=[
            ("journal_mode", "wal"),
            ("cache_size", -1024 * 64),
            ("foreign_keys", 1),
            ("ignore_check_constraints", 0),
            ("synchronous", 0),
            ("page_size", 1024 * 64),
        ],
)
app_db.load_extension('./lsm')

key = str(uuid.uuid4())
with app_db as db, db.bind_ctx([KV]):  # where KV is an LSM Table
    is_in_db = key in KV

``` 
This part `key in KV` raises a `KeyError`. Per your design, would you expect users to handle this error or would you prefer to fix in the peewee library?

The potential fixes in peewee could be:

1. Unify `LSMTable` and `ModelBase` by raising `DoesNotExist` in the `get_by_id` method and recast to `KeyError` only in `__getitem__`. The `__getitem__` change could be implemented at `ModelBase` given the interface mirrored is dictionary like; or
2. Overwrite `__contains__` in LSMTables to reflect that `KeyError` is thrown by `LSMTable.get_by_id`.

This is what I could come up with in the short time I reviewed the codebase. Would be great to hear your thoughts.

PS: Thank you for your blogs; I have learnt a lot from them especially as they cover working with novel datastores. 