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.
This commit is contained in:
parent
2b19b3a031
commit
5cf96b49e4
|
@ -596,7 +596,7 @@ class Model(six.with_metaclass(ModelBase)):
|
||||||
if field.rel and field.get_cache_name() in self.__dict__:
|
if field.rel and field.get_cache_name() in self.__dict__:
|
||||||
rel_instance = getattr(self, field.get_cache_name())
|
rel_instance = getattr(self, field.get_cache_name())
|
||||||
local_val = getattr(db_instance, field.attname)
|
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:
|
if local_val != related_val:
|
||||||
del self.__dict__[field.get_cache_name()]
|
del self.__dict__[field.get_cache_name()]
|
||||||
self._state.db = db_instance._state.db
|
self._state.db = db_instance._state.db
|
||||||
|
|
|
@ -735,6 +735,13 @@ class ModelRefreshTests(TestCase):
|
||||||
self.assertFalse(hasattr(s3_copy.selfref, 'touched'))
|
self.assertFalse(hasattr(s3_copy.selfref, 'touched'))
|
||||||
self.assertEqual(s3_copy.selfref, s2)
|
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):
|
def test_refresh_unsaved(self):
|
||||||
pub_date = self._truncate_ms(datetime.now())
|
pub_date = self._truncate_ms(datetime.now())
|
||||||
a = Article.objects.create(pub_date=pub_date)
|
a = Article.objects.create(pub_date=pub_date)
|
||||||
|
|
Loading…
Reference in New Issue