1
0
mirror of https://github.com/django/django.git synced 2025-10-12 00:09:11 +00:00

Fixed #36369 -- Cleared additional cached properties in apps.clear_cache().

Thanks Clifford Gama for the report.

Co-authored-by: Jacob Walls <jacobtylerwalls@gmail.com>
This commit is contained in:
Senthil Kumar 2025-07-16 20:54:21 +08:00 committed by Jacob Walls
parent fd705912ff
commit 5ee651f255
2 changed files with 29 additions and 0 deletions

View File

@ -100,6 +100,13 @@ class Options:
"managers_map",
"base_manager",
"default_manager",
"db_returning_fields",
"_property_names",
"pk_fields",
"total_unique_constraints",
"all_parents",
"swapped",
"verbose_name_raw",
}
REVERSE_PROPERTIES = {"related_objects", "fields_map", "_relation_tree"}

View File

@ -14,6 +14,7 @@ from django.test import (
skipUnlessDBFeature,
)
from django.test.utils import extend_sys_path, isolate_apps
from django.utils.functional import cached_property
from .models import SoAlternative, TotallyNormal, new_apps
from .one_config_app.apps import OneConfig
@ -215,6 +216,27 @@ class AppsTests(SimpleTestCase):
self.assertEqual(apps.get_swappable_settings_name.cache_info().currsize, 0)
self.assertEqual(apps.get_models.cache_info().currsize, 0)
@override_settings(INSTALLED_APPS=SOME_INSTALLED_APPS)
def test_cached_properties_cleared_after_cache_clear(self):
opts = apps.get_model("admin", "LogEntry")._meta
cached_properties = [
name
for name, attr in models.options.Options.__dict__.items()
if isinstance(attr, cached_property)
]
# Access each cached property to populate the cache.
for attr_name in cached_properties:
getattr(opts, attr_name)
self.assertIn(attr_name, opts.__dict__)
apps.clear_cache()
for attr_name in cached_properties:
with self.subTest(property=attr_name):
self.assertNotIn(attr_name, opts.__dict__)
@override_settings(INSTALLED_APPS=["apps.apps.RelabeledAppsConfig"])
def test_relabeling(self):
self.assertEqual(apps.get_app_config("relabeled").name, "apps")