From 69ab6e5896ff1a6d9e7ab8a28e75c28d3d7d65f4 Mon Sep 17 00:00:00 2001 From: Jacob Walls Date: Sun, 9 Mar 2025 11:18:11 -0400 Subject: [PATCH] Fixed #36207 -- Cleared cached ForeignObject relations via refresh_from_db(). --- django/db/models/base.py | 5 +++-- tests/foreign_object/tests.py | 9 +++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/django/db/models/base.py b/django/db/models/base.py index 34c537fea0..eaedd48748 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -756,11 +756,12 @@ class Model(AltersData, metaclass=ModelBase): db_instance = db_instance_qs.get() non_loaded_fields = db_instance.get_deferred_fields() - for field in self._meta.concrete_fields: + for field in self._meta.fields: if field.attname in non_loaded_fields: # This field wasn't refreshed - skip ahead. continue - setattr(self, field.attname, getattr(db_instance, field.attname)) + if field.concrete: + setattr(self, field.attname, getattr(db_instance, field.attname)) # Clear or copy cached foreign keys. if field.is_relation: if field.is_cached(db_instance): diff --git a/tests/foreign_object/tests.py b/tests/foreign_object/tests.py index 7670330995..696dfcd5fd 100644 --- a/tests/foreign_object/tests.py +++ b/tests/foreign_object/tests.py @@ -450,6 +450,15 @@ class MultiColumnFKTests(TestCase): normal_groups_lists = [list(p.groups.all()) for p in Person.objects.all()] self.assertEqual(groups_lists, normal_groups_lists) + def test_refresh_foreign_object(self): + member = Membership.objects.create( + membership_country=self.usa, person=self.bob, group=self.cia + ) + member.person = self.jim + with self.assertNumQueries(1): + member.refresh_from_db() + self.assertEqual(member.person, self.bob) + @translation.override("fi") def test_translations(self): a1 = Article.objects.create(pub_date=datetime.date.today())