diff options
| author | Paulo <commonzenpython@gmail.com> | 2017-09-19 12:51:19 -0500 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2017-10-12 17:29:53 -0400 |
| commit | 5d3f2aa3f12747822fb1ece95f0f614eeafa47b1 (patch) | |
| tree | 300156288158e25ccefcc8c8333716beb4b38230 | |
| parent | 51998a2988e076f811ec27bab5de4c17a6ae6828 (diff) | |
[2.0.x] Fixed #27846 -- Made Model.refresh_from_db() clear cached relations.
Backport of a7b5ad8b19a08d7d57302ece74f6e26d2887fd9f from master
| -rw-r--r-- | django/db/models/base.py | 6 | ||||
| -rw-r--r-- | tests/basic/models.py | 4 | ||||
| -rw-r--r-- | tests/basic/tests.py | 13 |
3 files changed, 22 insertions, 1 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py index dc59143eb5..87bd8c09bf 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -627,6 +627,12 @@ class Model(metaclass=ModelBase): related_val = None if rel_instance is None else getattr(rel_instance, field.target_field.attname) if local_val != related_val or (local_val is None and related_val is None): field.delete_cached_value(self) + + # Clear cached relations. + for field in self._meta.related_objects: + if field.is_cached(self): + field.delete_cached_value(self) + self._state.db = db_instance._state.db def serializable_value(self, field_name): diff --git a/tests/basic/models.py b/tests/basic/models.py index c08b147ac4..40de6ae7de 100644 --- a/tests/basic/models.py +++ b/tests/basic/models.py @@ -17,6 +17,10 @@ class Article(models.Model): return self.headline +class FeaturedArticle(models.Model): + article = models.OneToOneField(Article, models.CASCADE, related_name='featured') + + class ArticleSelectOnSave(Article): class Meta: proxy = True diff --git a/tests/basic/tests.py b/tests/basic/tests.py index c44e17dd24..5f608dab6f 100644 --- a/tests/basic/tests.py +++ b/tests/basic/tests.py @@ -11,7 +11,7 @@ from django.test import ( ) from django.utils.translation import gettext_lazy -from .models import Article, ArticleSelectOnSave, SelfRef +from .models import Article, ArticleSelectOnSave, FeaturedArticle, SelfRef class ModelInstanceCreationTests(TestCase): @@ -745,3 +745,14 @@ class ModelRefreshTests(TestCase): a = Article.objects.create(pub_date=self._truncate_ms(datetime.now())) with self.assertNumQueries(0): a.refresh_from_db(fields=[]) + + def test_refresh_clears_reverse_related(self): + """refresh_from_db() clear cached reverse relations.""" + article = Article.objects.create( + headline='Parrot programs in Python', + pub_date=datetime(2005, 7, 28), + ) + self.assertFalse(hasattr(article, 'featured')) + FeaturedArticle.objects.create(article_id=article.pk) + article.refresh_from_db() + self.assertTrue(hasattr(article, 'featured')) |
