Don't know if it's a big patch at all. A polymorphic call could be like this:
1. Check if the class is polymorphic by itself or by inheritance:
Traverse the inheritance D-Graph (we have to remember it's not a tree anymore) starting from the current class - It would stop on (and not count) models.Model (abstract=True and proxy models are also not counted). It should stop on the first parent having a Meta definition as I exposed before.
Having multiple (concrete) ancestors defining a Meta like that, would raise an exception.
Defining such Meta while an ancestor already defined it, would raise the same exception.
Not finding such Meta in the dgraph would have no effect, and the entire process would be ignored (i.e. a norma query could be executed over the current model). It could alternatively throw an exception or leave it as a settings option (CONTENTTYPE_POLYMORPHIC_EXCEPTION = True #you get the idea)
2. If the Meta was found, the polymorphic query could be done. Traverse the models down from the initial model class (i.e. the one from which the PQ was done on) enumerating concrete and nonproxy models. Basing in your idea, a narrow=(Model1, Model2, ...) argument could be specified to only include those models in the list, ignoring the rest (and stopping when all those model classes were iterated and found). As complement, an exclude=(Model1, Model2) could be alternatively specified to skip those classes (as skipping proxy and abstract classes in the enumeration).
3. Perform a select_related or prefetch_related query with the enumerated classes. This would do a join or prefetch perhaps only on the classes of interest (narrow=/exclude=) instead of doing the biggest possible join.
An alternative could be that to define a polymorphic model, the parent model could be a brand new contenttypes.models.PolymorphicModel (itself being abstract=True) and the nearest concrete ancestors must implement such Meta attributes (or an exception should be throw). Perhaps this (abstract) model could have a metaclass defining a new Manager for 'objects' attribute which could generate a queryset implementing this polymorphic() method.
Such model could have the widely-mentioned get_real_instance (as in django-polymorphic) or narrow() as mentioned in the post. The implementation could vary: it starts by getting the current object's contenttype from the discriminator and get the model class for it. if narrow-style is implemented, issubclass() could be called to determine whether the object belongs to any of those classes and return the real instance if so (it could avoid loading a non-specified class lazily). implementing get_real_instance class could load lazily the class if was not specified.
As I see, an implementation like I described (which is not new at all) could let you leverage the polymorphism level and let you suffer the tradeoffs you choose.
Remember that, with this (rant-styled, but improved from reading the post you pointed me to) proposal, anyone could choose to use the polymorphism in the queries or not, by calling explicitly such method on the query. Not using it would behave as normal queries.