From 5cc746206726c538c36a2830e7c068f1c8a0e7c8 Mon Sep 17 00:00:00 2001 From: Sergey Fedoseev Date: Fri, 4 Aug 2017 11:20:15 +0500 Subject: [PATCH] Refs #28459 -- Optimized ModelState instantiation. --- django/db/models/base.py | 22 +++++++++++++++------- tests/model_regress/test_state.py | 8 ++++++++ 2 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 tests/model_regress/test_state.py diff --git a/django/db/models/base.py b/django/db/models/base.py index 3cff2d2fc4..d39c0b9ea6 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -370,15 +370,23 @@ class ModelBase(type): return cls._meta.default_manager +class ModelStateFieldsCacheDescriptor: + def __get__(self, instance, cls=None): + if instance is None: + return self + res = instance.fields_cache = {} + return res + + class ModelState: """Store model instance state.""" - def __init__(self, db=None): - self.db = db - # If true, uniqueness validation checks will consider this a new, as-yet-unsaved object. - # Necessary for correct validation of new instances of objects with explicit (non-auto) PKs. - # This impacts validation only; it has no effect on the actual save. - self.adding = True - self.fields_cache = {} + db = None + # If true, uniqueness validation checks will consider this a new, unsaved + # object. Necessary for correct validation of new instances of objects with + # explicit (non-auto) PKs. This impacts validation only; it has no effect + # on the actual save. + adding = True + fields_cache = ModelStateFieldsCacheDescriptor() class Model(metaclass=ModelBase): diff --git a/tests/model_regress/test_state.py b/tests/model_regress/test_state.py new file mode 100644 index 0000000000..f41e4e52f4 --- /dev/null +++ b/tests/model_regress/test_state.py @@ -0,0 +1,8 @@ +from django.db.models.base import ModelState, ModelStateFieldsCacheDescriptor +from django.test import SimpleTestCase + + +class ModelStateTests(SimpleTestCase): + + def test_fields_cache_descriptor(self): + self.assertIsInstance(ModelState.fields_cache, ModelStateFieldsCacheDescriptor)