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 collections import defaultdict
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.db.models import FieldDoesNotExist
from django.db.models.query import ModelIterable, Q, QuerySet from django.db.models.query import ModelIterable, Q, QuerySet
from django.utils import six from django.utils import six
@ -392,6 +393,10 @@ class PolymorphicQuerySet(QuerySet):
# now a superclass of real_concrete_class. Thus it's # now a superclass of real_concrete_class. Thus it's
# sufficient to just use the field name. # sufficient to just use the field name.
translated_field_name = field.rpartition('___')[-1] translated_field_name = field.rpartition('___')[-1]
try:
real_concrete_class._meta.get_field(translated_field_name)
except FieldDoesNotExist:
continue
else: else:
raise raise

View File

@ -81,6 +81,7 @@ class ModelShow2_plain(ModelShow1_plain):
class Base(ShowFieldType, PolymorphicModel): class Base(ShowFieldType, PolymorphicModel):
polymorphic_showfield_deferred = True
field_b = models.CharField(max_length=10) 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), ' '<Model2D: id 4, field1 (CharField), field2 (CharField), field3 (CharField), field4 (CharField), '
'deferred[field2,field3,field4,model2a_ptr_id,model2b_ptr_id]>') '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): def test_defer_related_fields(self):
self.create_model2abcd() self.create_model2abcd()