فهرست منبع

Fixed #25296 -- Prevented model related object cache pollution when create() fails due to an unsaved object.

Raphael Merx 9 سال پیش
والد
کامیت
f5a33e4840
2فایلهای تغییر یافته به همراه8 افزوده شده و 0 حذف شده
  1. 3 0
      django/db/models/base.py
  2. 5 0
      tests/one_to_one/tests.py

+ 3 - 0
django/db/models/base.py

@@ -643,6 +643,9 @@ class Model(six.with_metaclass(ModelBase)):
                 # constraints aren't supported by the database, there's the
                 # unavoidable risk of data corruption.
                 if obj and obj.pk is None:
+                    # Remove the object from a related instance cache.
+                    if not field.remote_field.multiple:
+                        delattr(obj, field.remote_field.get_cache_name())
                     raise ValueError(
                         "save() prohibited to prevent data loss due to "
                         "unsaved related object '%s'." % field.name

+ 5 - 0
tests/one_to_one/tests.py

@@ -135,9 +135,14 @@ class OneToOneTests(TestCase):
         should raise an exception.
         """
         place = Place(name='User', address='London')
+        with self.assertRaises(Restaurant.DoesNotExist):
+            place.restaurant
         msg = "save() prohibited to prevent data loss due to unsaved related object 'place'."
         with self.assertRaisesMessage(ValueError, msg):
             Restaurant.objects.create(place=place, serves_hot_dogs=True, serves_pizza=False)
+        # place should not cache restaurant
+        with self.assertRaises(Restaurant.DoesNotExist):
+            place.restaurant
 
     def test_reverse_relationship_cache_cascade(self):
         """