From c1605566393c5834b8113b87e393c4d3070b77ce Mon Sep 17 00:00:00 2001 From: Diederik van der Boor Date: Fri, 12 Jul 2019 11:59:13 +0200 Subject: [PATCH] Merge PR #259 logic in a Django compatible way --- polymorphic/query_translate.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/polymorphic/query_translate.py b/polymorphic/query_translate.py index 5c8f773..51646b6 100644 --- a/polymorphic/query_translate.py +++ b/polymorphic/query_translate.py @@ -215,19 +215,26 @@ def _get_all_sub_models(base_model): def _create_base_path(baseclass, myclass): # create new field path for expressions, e.g. for baseclass=ModelA, myclass=ModelC # 'modelb__modelc" is returned - bases = myclass.__bases__ - for b in bases: + for b in myclass.__bases__: if b == baseclass: return _get_query_related_name(myclass) + path = _create_base_path(baseclass, b) if path: if b._meta.abstract or b._meta.proxy: - return myclass.__name__.lower() - return path + '__' + _get_query_related_name(myclass) + return _get_query_related_name(myclass) + else: + return path + '__' + _get_query_related_name(myclass) return '' def _get_query_related_name(myclass): + for f in myclass._meta.local_fields: + if isinstance(f, models.OneToOneField) and f.remote_field.parent_link: + return f.related_query_name() + + # Fallback to undetected name, + # this happens on proxy models (e.g. SubclassSelectorProxyModel) return myclass.__name__.lower()