From 123b1d3fcf79f091573c40be6da7113a6ef35b62 Mon Sep 17 00:00:00 2001 From: Bhuvnesh Date: Mon, 7 Nov 2022 12:36:30 +0530 Subject: [PATCH] Fixed #34137 -- Made Model.refresh_from_db() clear cached generic relations. Thanks Simon Charette for the implementation idea. --- django/db/models/base.py | 5 +++++ tests/contenttypes_tests/test_fields.py | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/django/db/models/base.py b/django/db/models/base.py index 133adb6f3a..668b8cc221 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -737,6 +737,11 @@ class Model(AltersData, metaclass=ModelBase): if field.is_cached(self): field.delete_cached_value(self) + # Clear cached private relations. + for field in self._meta.private_fields: + if field.is_relation and field.is_cached(self): + field.delete_cached_value(self) + self._state.db = db_instance._state.db async def arefresh_from_db(self, using=None, fields=None): diff --git a/tests/contenttypes_tests/test_fields.py b/tests/contenttypes_tests/test_fields.py index 170b38d018..418669140b 100644 --- a/tests/contenttypes_tests/test_fields.py +++ b/tests/contenttypes_tests/test_fields.py @@ -43,6 +43,14 @@ class GenericForeignKeyTests(TestCase): self.assertIsNone(post.parent) self.assertIsNone(post.parent) + def test_clear_cached_generic_relation(self): + question = Question.objects.create(text="What is your name?") + answer = Answer.objects.create(text="Answer", question=question) + old_entity = answer.question + answer.refresh_from_db() + new_entity = answer.question + self.assertIsNot(old_entity, new_entity) + class GenericRelationTests(TestCase): def test_value_to_string(self):