Loading django/db/models/base.py +1 −1 Original line number Diff line number Diff line Loading @@ -630,7 +630,7 @@ class Model(six.with_metaclass(ModelBase)): rel_instance = getattr(self, field.get_cache_name()) local_val = getattr(db_instance, 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 or (local_val is None and related_val is None): del self.__dict__[field.get_cache_name()] self._state.db = db_instance._state.db Loading docs/releases/1.8.7.txt +3 −0 Original line number Diff line number Diff line Loading @@ -36,3 +36,6 @@ Bugfixes :class:`~django.contrib.postgres.fields.DateTimeRangeField` (:ticket:`24937`). * Fixed the exact lookup of ``ArrayField`` (:ticket:`25666`). * Fixed ``Model.refresh_from_db()`` updating of ``ForeignKey`` fields with ``on_delete=models.SET_NULL`` (:ticket:`25715`). tests/basic/models.py +1 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ class ArticleSelectOnSave(Article): class SelfRef(models.Model): selfref = models.ForeignKey('self', null=True, blank=True, related_name='+') article = models.ForeignKey(Article, on_delete=models.SET_NULL, null=True, blank=True) def __str__(self): # This method intentionally doesn't work for all cases - part Loading tests/basic/tests.py +11 −0 Original line number Diff line number Diff line Loading @@ -767,6 +767,17 @@ class ModelRefreshTests(TestCase): self.assertEqual(a2.pub_date, pub_date) self.assertEqual(a2._state.db, "default") def test_refresh_fk_on_delete_set_null(self): a = Article.objects.create( headline='Parrot programs in Python', pub_date=datetime(2005, 7, 28), ) s1 = SelfRef.objects.create(article=a) a.delete() s1.refresh_from_db() self.assertIsNone(s1.article_id) self.assertIsNone(s1.article) def test_refresh_no_fields(self): a = Article.objects.create(pub_date=self._truncate_ms(datetime.now())) with self.assertNumQueries(0): Loading Loading
django/db/models/base.py +1 −1 Original line number Diff line number Diff line Loading @@ -630,7 +630,7 @@ class Model(six.with_metaclass(ModelBase)): rel_instance = getattr(self, field.get_cache_name()) local_val = getattr(db_instance, 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 or (local_val is None and related_val is None): del self.__dict__[field.get_cache_name()] self._state.db = db_instance._state.db Loading
docs/releases/1.8.7.txt +3 −0 Original line number Diff line number Diff line Loading @@ -36,3 +36,6 @@ Bugfixes :class:`~django.contrib.postgres.fields.DateTimeRangeField` (:ticket:`24937`). * Fixed the exact lookup of ``ArrayField`` (:ticket:`25666`). * Fixed ``Model.refresh_from_db()`` updating of ``ForeignKey`` fields with ``on_delete=models.SET_NULL`` (:ticket:`25715`).
tests/basic/models.py +1 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ class ArticleSelectOnSave(Article): class SelfRef(models.Model): selfref = models.ForeignKey('self', null=True, blank=True, related_name='+') article = models.ForeignKey(Article, on_delete=models.SET_NULL, null=True, blank=True) def __str__(self): # This method intentionally doesn't work for all cases - part Loading
tests/basic/tests.py +11 −0 Original line number Diff line number Diff line Loading @@ -767,6 +767,17 @@ class ModelRefreshTests(TestCase): self.assertEqual(a2.pub_date, pub_date) self.assertEqual(a2._state.db, "default") def test_refresh_fk_on_delete_set_null(self): a = Article.objects.create( headline='Parrot programs in Python', pub_date=datetime(2005, 7, 28), ) s1 = SelfRef.objects.create(article=a) a.delete() s1.refresh_from_db() self.assertIsNone(s1.article_id) self.assertIsNone(s1.article) def test_refresh_no_fields(self): a = Article.objects.create(pub_date=self._truncate_ms(datetime.now())) with self.assertNumQueries(0): Loading