diff options
| author | Aymeric Augustin <aymeric.augustin@m4x.org> | 2015-09-19 13:36:38 +0200 |
|---|---|---|
| committer | Aymeric Augustin <aymeric.augustin@m4x.org> | 2015-09-19 20:27:53 +0200 |
| commit | c3904deb919823af577adf5d9d35e9c113eb8289 (patch) | |
| tree | f8d22a2af5f600c7989a991bbdc62cf93d29e784 | |
| parent | a4b80e242162a7d6ac2337a2a621a82027c549b7 (diff) | |
Fixed #25160 (again) -- Moved data loss check on reverse relations.
Moved data loss check when assigning to a reverse one-to-one relation on
an unsaved instance to Model.save(). This is exactly the same change as
e4b813c but for reverse relations.
| -rw-r--r-- | django/db/models/fields/related.py | 6 | ||||
| -rw-r--r-- | docs/releases/1.8.5.txt | 4 | ||||
| -rw-r--r-- | docs/releases/1.8.txt | 3 | ||||
| -rw-r--r-- | tests/one_to_one/tests.py | 12 |
4 files changed, 14 insertions, 11 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index 2e2ec38335..41347067f1 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -534,12 +534,6 @@ class SingleRelatedObjectDescriptor(object): raise ValueError('Cannot assign "%r": the current database router prevents this relation.' % value) related_pk = tuple(getattr(instance, field.attname) for field in self.related.field.foreign_related_fields) - if None in related_pk: - raise ValueError( - 'Cannot assign "%r": "%s" instance isn\'t saved in the database.' % - (value, instance._meta.object_name) - ) - # Set the value of the related field to the value of the related object's related field for index, field in enumerate(self.related.field.local_related_fields): setattr(value, field.attname, related_pk[index]) diff --git a/docs/releases/1.8.5.txt b/docs/releases/1.8.5.txt index 5a19a50137..ce03577cde 100644 --- a/docs/releases/1.8.5.txt +++ b/docs/releases/1.8.5.txt @@ -39,3 +39,7 @@ Bugfixes * Fixed custom queryset chaining with ``values()`` and ``values_list()`` (:ticket:`20625`). + +* Moved the :ref:`unsaved model instance assignment data loss check + <unsaved-model-instance-check-18>` on reverse relations to ``Model.save()`` + (:ticket:`25160`). diff --git a/docs/releases/1.8.txt b/docs/releases/1.8.txt index a6fa2785fc..a2d98656b6 100644 --- a/docs/releases/1.8.txt +++ b/docs/releases/1.8.txt @@ -702,6 +702,9 @@ Assigning unsaved objects to relations raises an error ... ValueError: save() prohibited to prevent data loss due to unsaved related object 'author'. + A similar check on assignment to reverse one-to-one relations was removed + in Django 1.8.5. + Assigning unsaved objects to a :class:`~django.db.models.ForeignKey`, :class:`~django.contrib.contenttypes.fields.GenericForeignKey`, and :class:`~django.db.models.OneToOneField` now raises a :exc:`ValueError`. diff --git a/tests/one_to_one/tests.py b/tests/one_to_one/tests.py index 49da8dfbd2..1319cf0d9b 100644 --- a/tests/one_to_one/tests.py +++ b/tests/one_to_one/tests.py @@ -373,13 +373,15 @@ class OneToOneTests(TestCase): """ p = Place() b = UndergroundBar.objects.create() - msg = ( - 'Cannot assign "<UndergroundBar: UndergroundBar object>": "Place" ' - 'instance isn\'t saved in the database.' - ) + + # Assigning a reverse relation on an unsaved object is allowed. + p.undergroundbar = b + + # However saving the object is not allowed. + msg = "save() prohibited to prevent data loss due to unsaved related object 'place'." with self.assertNumQueries(0): with self.assertRaisesMessage(ValueError, msg): - p.undergroundbar = b + b.save() def test_nullable_o2o_delete(self): u = UndergroundBar.objects.create(place=self.p1) |
