summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaulo <commonzenpython@gmail.com>2017-09-19 12:51:19 -0500
committerTim Graham <timograham@gmail.com>2017-10-12 17:29:53 -0400
commit5d3f2aa3f12747822fb1ece95f0f614eeafa47b1 (patch)
tree300156288158e25ccefcc8c8333716beb4b38230
parent51998a2988e076f811ec27bab5de4c17a6ae6828 (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.py6
-rw-r--r--tests/basic/models.py4
-rw-r--r--tests/basic/tests.py13
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'))