As BaseHandler class defines the .queryset(self, request) method, the .has_model(self) method always returns True, nonwithstanding the absence of the model. (handler.py:58-62)
On the other side, the read() default method is using the model attribute (to get the pkfield name) just after checking that has_model is True. (handler.py:81-84).
This makes the BaseHandler's CRUD (read, at least) imploementation impossible to use without the model, in the sense that one cannot overwrite the 'queryset' method to specify custom behavior in absence of the model.
Either the has_model() or the default read() method should be changed to solve this.