[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.
This commit is contained in:
Claude Paroz 2015-02-27 18:19:56 +01:00
parent 9d6f0dce13
commit b825ec38c1
2 changed files with 8 additions and 1 deletions

View File

@ -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

View File

@ -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)