mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[1.10.x] Fixed #26900 -- Fixed crash accessing deferred FileFields.
Backport of 7c33aa8a87 from master
			
			
This commit is contained in:
		| @@ -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): | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user