summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2015-02-27 18:19:56 +0100
committerClaude Paroz <claude@2xlibre.net>2015-02-27 20:25:12 +0100
commitb825ec38c1e16a271c69694562963eadbe0c6352 (patch)
treee140d5ef5464c4ce5cdd035905069c0753a5c881
parent9d6f0dce139b5dc9ee019f16623e12c6579b45e3 (diff)
[1.8.x] Fixed #24418 -- Prevented crash in refresh_from_db with null fk
Thanks Johannes Lerch for the report, Tim Graham for the test case, and Simon Charette for the review. Backport of 5cf96b49e4 from master.
-rw-r--r--django/db/models/base.py2
-rw-r--r--tests/basic/tests.py7
2 files changed, 8 insertions, 1 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py
index f75d20325f..4b51ca85d8 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -629,7 +629,7 @@ class Model(six.with_metaclass(ModelBase)):
if field.rel and field.get_cache_name() in self.__dict__:
rel_instance = getattr(self, field.get_cache_name())
local_val = getattr(db_instance, field.attname)
- related_val = getattr(rel_instance, field.related_field.attname)
+ related_val = None if rel_instance is None else getattr(rel_instance, field.related_field.attname)
if local_val != related_val:
del self.__dict__[field.get_cache_name()]
self._state.db = db_instance._state.db
diff --git a/tests/basic/tests.py b/tests/basic/tests.py
index 53efba318d..ee6587ddce 100644
--- a/tests/basic/tests.py
+++ b/tests/basic/tests.py
@@ -736,6 +736,13 @@ class ModelRefreshTests(TestCase):
self.assertFalse(hasattr(s3_copy.selfref, 'touched'))
self.assertEqual(s3_copy.selfref, s2)
+ def test_refresh_null_fk(self):
+ s1 = SelfRef.objects.create()
+ s2 = SelfRef.objects.create(selfref=s1)
+ s2.selfref = None
+ s2.refresh_from_db()
+ self.assertEqual(s2.selfref, s1)
+
def test_refresh_unsaved(self):
pub_date = self._truncate_ms(datetime.now())
a = Article.objects.create(pub_date=pub_date)