diff --git a/django/db/models/fields/files.py b/django/db/models/fields/files.py index b03d54366a..7ee38d937f 100644 --- a/django/db/models/fields/files.py +++ b/django/db/models/fields/files.py @@ -123,11 +123,21 @@ class FieldFile(File): file.close() def __getstate__(self): - # FieldFile needs access to its associated model field and an instance - # it's attached to in order to work properly, but the only necessary - # data to be pickled is the file's name itself. Everything else will - # be restored later, by FileDescriptor below. - return {'name': self.name, 'closed': False, '_committed': True, '_file': None} + # FieldFile needs access to its associated model field, an instance and + # the file's name. Everything else will be restored later, by + # FileDescriptor below. + return { + 'name': self.name, + 'closed': False, + '_committed': True, + '_file': None, + 'instance': self.instance, + 'field': self.field, + } + + def __setstate__(self, state): + self.__dict__.update(state) + self.storage = self.field.storage class FileDescriptor: diff --git a/tests/model_fields/test_filefield.py b/tests/model_fields/test_filefield.py index d25868d7cd..5600051a35 100644 --- a/tests/model_fields/test_filefield.py +++ b/tests/model_fields/test_filefield.py @@ -122,3 +122,7 @@ class FileFieldTests(TestCase): myfile_dump = pickle.dumps(document.myfile) loaded_myfile = pickle.loads(myfile_dump) self.assertEqual(document.myfile, loaded_myfile) + self.assertEqual(document.myfile.url, loaded_myfile.url) + self.assertEqual(document.myfile.storage, loaded_myfile.storage) + self.assertEqual(document.myfile.instance, loaded_myfile.instance) + self.assertEqual(document.myfile.field, loaded_myfile.field) diff --git a/tests/model_fields/test_imagefield.py b/tests/model_fields/test_imagefield.py index e4390a2507..99831cb0a3 100644 --- a/tests/model_fields/test_imagefield.py +++ b/tests/model_fields/test_imagefield.py @@ -188,6 +188,10 @@ class ImageFieldTests(ImageFieldTestMixin, TestCase): mugshot_dump = pickle.dumps(p.mugshot) loaded_mugshot = pickle.loads(mugshot_dump) self.assertEqual(p.mugshot, loaded_mugshot) + self.assertEqual(p.mugshot.url, loaded_mugshot.url) + self.assertEqual(p.mugshot.storage, loaded_mugshot.storage) + self.assertEqual(p.mugshot.instance, loaded_mugshot.instance) + self.assertEqual(p.mugshot.field, loaded_mugshot.field) def test_defer(self): self.PersonModel.objects.create(name='Joe', mugshot=self.file1)