Commit b825ec38 authored by Claude Paroz's avatar Claude Paroz
Browse files

[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 5cf96b49 from master.
parent 9d6f0dce
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
+7 −0
Original line number Diff line number Diff line
@@ -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)