[1.10.x] Fixed #26900 -- Fixed crash accessing deferred FileFields.
Backport of 7c33aa8a87
from master
This commit is contained in:
parent
6646a396cc
commit
a03ac61332
|
@ -167,7 +167,11 @@ class FileDescriptor(object):
|
||||||
|
|
||||||
# The instance dict contains whatever was originally assigned
|
# The instance dict contains whatever was originally assigned
|
||||||
# in __set__.
|
# in __set__.
|
||||||
file = instance.__dict__[self.field.name]
|
if self.field.name in instance.__dict__:
|
||||||
|
file = instance.__dict__[self.field.name]
|
||||||
|
else:
|
||||||
|
instance.refresh_from_db(fields=[self.field.name])
|
||||||
|
file = getattr(instance, self.field.name)
|
||||||
|
|
||||||
# If this value is a string (instance.file = "path/to/file") or None
|
# If this value is a string (instance.file = "path/to/file") or None
|
||||||
# then we simply wrap it with the appropriate attribute class according
|
# then we simply wrap it with the appropriate attribute class according
|
||||||
|
@ -437,9 +441,10 @@ class ImageField(FileField):
|
||||||
Dimensions can be forced to update with force=True, which is how
|
Dimensions can be forced to update with force=True, which is how
|
||||||
ImageFileDescriptor.__set__ calls this method.
|
ImageFileDescriptor.__set__ calls this method.
|
||||||
"""
|
"""
|
||||||
# Nothing to update if the field doesn't have dimension fields.
|
# Nothing to update if the field doesn't have dimension fields or if
|
||||||
|
# the field is deferred.
|
||||||
has_dimension_fields = self.width_field or self.height_field
|
has_dimension_fields = self.width_field or self.height_field
|
||||||
if not has_dimension_fields:
|
if not has_dimension_fields or self.attname not in instance.__dict__:
|
||||||
return
|
return
|
||||||
|
|
||||||
# getattr will call the ImageFileDescriptor's __get__ method, which
|
# getattr will call the ImageFileDescriptor's __get__ method, which
|
||||||
|
|
|
@ -50,3 +50,7 @@ class FileFieldTests(TestCase):
|
||||||
d = Document.objects.create(myfile='something.txt')
|
d = Document.objects.create(myfile='something.txt')
|
||||||
d.refresh_from_db()
|
d.refresh_from_db()
|
||||||
self.assertIs(d.myfile.instance, d)
|
self.assertIs(d.myfile.instance, d)
|
||||||
|
|
||||||
|
def test_defer(self):
|
||||||
|
Document.objects.create(myfile='something.txt')
|
||||||
|
self.assertEqual(Document.objects.defer('myfile')[0].myfile, 'something.txt')
|
||||||
|
|
|
@ -188,6 +188,13 @@ class ImageFieldTests(ImageFieldTestMixin, TestCase):
|
||||||
loaded_p = pickle.loads(dump)
|
loaded_p = pickle.loads(dump)
|
||||||
self.assertEqual(p.mugshot, loaded_p.mugshot)
|
self.assertEqual(p.mugshot, loaded_p.mugshot)
|
||||||
|
|
||||||
|
def test_defer(self):
|
||||||
|
self.PersonModel.objects.create(name='Joe', mugshot=self.file1)
|
||||||
|
with self.assertNumQueries(1):
|
||||||
|
qs = list(self.PersonModel.objects.defer('mugshot'))
|
||||||
|
with self.assertNumQueries(0):
|
||||||
|
self.assertEqual(qs[0].name, 'Joe')
|
||||||
|
|
||||||
|
|
||||||
@skipIf(Image is None, "Pillow is required to test ImageField")
|
@skipIf(Image is None, "Pillow is required to test ImageField")
|
||||||
class ImageFieldTwoDimensionsTests(ImageFieldTestMixin, TestCase):
|
class ImageFieldTwoDimensionsTests(ImageFieldTestMixin, TestCase):
|
||||||
|
|
Loading…
Reference in New Issue