The chain of joins with None fields
Yes, this was a design decision. If you omit the model how will you traverse the graph? I can't continue traversing the graph if some _node_ will have all fields equal to None. But it gives the wrong info that the node (model) _exists_. So, this decision doesn't give benefits.

For traversing I use the following helper function:
```
def get_deep(obj_dic, *keys):
    if not keys:
        return obj_dic
    if obj_dic is None:
        return None
    if isinstance(obj_dic, dict):
        return get_deep(obj_dic.get(keys[0], None), *keys[1:])
    else:
        return get_deep(getattr(obj_dic, keys[0], None), *keys[1:])
``` Ok, I follow your point. Not all fields are None, but the chain fields are not None. Anyway, it requires different ways to check the existence of an intermediate and of the last node.

What are your views on adding the last model to the chain as well? It will give the ability to add a helper method that will answer: does the model exists or not? It will also be universal for all nodes in the chain of joins.
I've found unexpected behavior due to [this](https://github.com/coleifer/peewee/commit/6bdcd7dc3800654ba034d03b3e7dc01971388e34#r44050928). In case of join to a base model, joined model (but absent; through `LEFT JOIN`) to the field will not be None unless it is the last in the join chain. Models with all fields equal to None is not None originally and requires an additional check for the primary key field to None. It's especially dangerous if you add a new join to the query just, but have to review all places where it is used to change the way of checking to None.