mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[1.10.x] Fixed #26787 -- Documented deleting and reloading of model instance fields.
Thanks Julien Hartmann for the report.
Backport of 20d1cb33c2 from master
			
			
This commit is contained in:
		| @@ -128,6 +128,18 @@ in the ``from_db()`` method. | |||||||
| Refreshing objects from database | Refreshing objects from database | ||||||
| ================================ | ================================ | ||||||
|  |  | ||||||
|  | If you delete a field from a model instance, accessing it again reloads the | ||||||
|  | value from the database:: | ||||||
|  |  | ||||||
|  |     >>> obj = MyModel.objects.first() | ||||||
|  |     >>> del obj.field | ||||||
|  |     >>> obj.field  # Loads the field from the database | ||||||
|  |  | ||||||
|  | .. versionchanged:: 1.10 | ||||||
|  |  | ||||||
|  |     In older versions, accessing a deleted field raised ``AttributeError`` | ||||||
|  |     instead of reloading it. | ||||||
|  |  | ||||||
| .. method:: Model.refresh_from_db(using=None, fields=None) | .. method:: Model.refresh_from_db(using=None, fields=None) | ||||||
|  |  | ||||||
| If you need to reload a model's values from the database, you can use the | If you need to reload a model's values from the database, you can use the | ||||||
|   | |||||||
| @@ -884,6 +884,9 @@ Miscellaneous | |||||||
| * The ``_base_manager`` and ``_default_manager`` attributes are removed from | * The ``_base_manager`` and ``_default_manager`` attributes are removed from | ||||||
|   model instances. They remain accessible on the model class. |   model instances. They remain accessible on the model class. | ||||||
|  |  | ||||||
|  | * Accessing a deleted field on a model instance, e.g. after ``del obj.field``, | ||||||
|  |   reloads the field's value instead of raising ``AttributeError``. | ||||||
|  |  | ||||||
| .. _deprecated-features-1.10: | .. _deprecated-features-1.10: | ||||||
|  |  | ||||||
| Features deprecated in 1.10 | Features deprecated in 1.10 | ||||||
|   | |||||||
| @@ -421,6 +421,19 @@ class ModelTest(TestCase): | |||||||
|             # hash) |             # hash) | ||||||
|             hash(Article()) |             hash(Article()) | ||||||
|  |  | ||||||
|  |     def test_delete_and_access_field(self): | ||||||
|  |         # Accessing a field after it's deleted from a model reloads its value. | ||||||
|  |         pub_date = datetime.now() | ||||||
|  |         article = Article.objects.create(headline='foo', pub_date=pub_date) | ||||||
|  |         new_pub_date = article.pub_date + timedelta(days=10) | ||||||
|  |         article.headline = 'bar' | ||||||
|  |         article.pub_date = new_pub_date | ||||||
|  |         del article.headline | ||||||
|  |         with self.assertNumQueries(1): | ||||||
|  |             self.assertEqual(article.headline, 'foo') | ||||||
|  |         # Fields that weren't deleted aren't reloaded. | ||||||
|  |         self.assertEqual(article.pub_date, new_pub_date) | ||||||
|  |  | ||||||
|  |  | ||||||
| class ModelLookupTest(TestCase): | class ModelLookupTest(TestCase): | ||||||
|     def setUp(self): |     def setUp(self): | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user