Merge branch 'fix-defer-childs-same-polymorphic-parent' into master

fix_request_path_info
Diederik van der Boor 2017-09-30 20:26:37 +02:00
commit 2e16112cbe
3 changed files with 23 additions and 0 deletions

View File

@ -8,6 +8,7 @@ import copy
from collections import defaultdict
from django.contrib.contenttypes.models import ContentType
from django.db.models import FieldDoesNotExist
from django.db.models.query import ModelIterable, Q, QuerySet
from django.utils import six
@ -392,6 +393,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

View File

@ -81,6 +81,7 @@ class ModelShow2_plain(ModelShow1_plain):
class Base(ShowFieldType, PolymorphicModel):
polymorphic_showfield_deferred = True
field_b = models.CharField(max_length=10)

View File

@ -252,6 +252,23 @@ class PolymorphicTests(TransactionTestCase):
'<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField), '
'deferred[field2,field3,field4,model2a_ptr_id,model2b_ptr_id]>')
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]),
'<ModelX: id 3, field_b (CharField), field_x (CharField)>')
self.assertEqual(repr(objects_deferred[1]),
'<ModelY: id 4, field_b (CharField), field_y (CharField), deferred[field_y]>')
objects_only = Base.objects.only(
'polymorphic_ctype', 'ModelY___field_y', 'ModelX___field_x',
)
self.assertEqual(repr(objects_only[0]),
'<ModelX: id 3, field_b (CharField), field_x (CharField), deferred[field_b]>')
self.assertEqual(repr(objects_only[1]),
'<ModelY: id 4, field_b (CharField), field_y (CharField), deferred[field_b]>')
def test_defer_related_fields(self):
self.create_model2abcd()