Off the top of my head, I can only think of the following ways to rule it in or out as a model/string, and I'm not sure which (if any) _check whether the thing is a model class pre-emptively_  might refer to:

- use issubclass.
- test the input using isinstance [and testing which, basestring or deferring to six.string_type where possible?]
- test the input for an attribute like _meta using hasattr(), which is hiding an AttributeError

The best I can come up with changing it all to something like:
```
if hasattr(thing, '_meta'):
    # do model stuff
    model_str = self._get_ancestor_path(thing) # 
else:
    model_str = thing
if model_str in calculated_subclasses:
    verified_subclasses.append(model_str)
```
Lest we go round in circles with me implementing the wrong change each time, if you could clarify how you'd like to see the _pre-emptive model check_ part work, I can try and fix it up.