diff --git a/polymorphic/query.py b/polymorphic/query.py index 3d881d8..4430c2b 100644 --- a/polymorphic/query.py +++ b/polymorphic/query.py @@ -9,6 +9,7 @@ from collections import defaultdict import django from django.contrib.contenttypes.models import ContentType +from django.db.models import FieldDoesNotExist from django.db.models.query import Q, QuerySet from django.utils import six @@ -402,6 +403,10 @@ class PolymorphicQuerySet(QuerySet): # now a superclass of real_concrete_class. Thus it's # sufficient to just use the field name. translated_field_name = field.rpartition('___')[-1] + try: + real_concrete_class._meta.get_field(translated_field_name) + except FieldDoesNotExist: + continue else: raise diff --git a/polymorphic/tests/__init__.py b/polymorphic/tests/__init__.py index 32e1838..6fd2a2a 100644 --- a/polymorphic/tests/__init__.py +++ b/polymorphic/tests/__init__.py @@ -82,6 +82,7 @@ class ModelShow2_plain(ModelShow1_plain): class Base(ShowFieldType, PolymorphicModel): field_b = models.CharField(max_length=10) + polymorphic_showfield_deferred = True class ModelX(Base): diff --git a/polymorphic/tests/test_orm.py b/polymorphic/tests/test_orm.py index 76e24b7..bc30622 100644 --- a/polymorphic/tests/test_orm.py +++ b/polymorphic/tests/test_orm.py @@ -178,6 +178,23 @@ class PolymorphicTests(TestCase): '') + ModelX.objects.create(field_b="A1", field_x="A2") + ModelY.objects.create(field_b="B1", field_y="B2") + + objects_deferred = Base.objects.defer('ModelY___field_y') + self.assertEqual(repr(objects_deferred[0]), + '') + self.assertEqual(repr(objects_deferred[1]), + '') + + objects_only = Base.objects.only( + 'polymorphic_ctype', 'ModelY___field_y', 'ModelX___field_x', + ) + self.assertEqual(repr(objects_only[0]), + '') + self.assertEqual(repr(objects_only[1]), + '') + def test_defer_related_fields(self): self.create_model2abcd()