summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2015-04-07 09:08:05 -0400
committerTim Graham <timograham@gmail.com>2015-04-09 08:24:07 -0400
commitb1dc128a03fc586b42a0d9f26dfe0bc7655ea6e8 (patch)
tree3bf0af341e5ce10ad5262c48659050dc3d012035
parentd11e87bff50a9b53de2fe683740fb875d3d2d9e9 (diff)
[1.8.x] Fixed #24578 -- Fixed crash with QuerySet.update() on FK to O2O fields.
Thanks Anssi Kääriäinen for review. Backport of 10b4c010ab2cdaa6ba8bfaec3e3540299ea77be from master
-rw-r--r--django/db/models/base.py2
-rw-r--r--docs/releases/1.8.1.txt3
-rw-r--r--tests/one_to_one/tests.py11
3 files changed, 15 insertions, 1 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py
index 4b51ca85d8..86ba01ffcc 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -912,7 +912,7 @@ class Model(six.with_metaclass(ModelBase)):
def prepare_database_save(self, field):
if self.pk is None:
raise ValueError("Unsaved model instance %r cannot be used in an ORM query." % self)
- return getattr(self, field.rel.field_name)
+ return getattr(self, field.rel.get_related_field().attname)
def clean(self):
"""
diff --git a/docs/releases/1.8.1.txt b/docs/releases/1.8.1.txt
index ac986b3fc0..5df9982a1d 100644
--- a/docs/releases/1.8.1.txt
+++ b/docs/releases/1.8.1.txt
@@ -28,3 +28,6 @@ Bugfixes
* Fixed a migration crash when altering
:class:`~django.db.models.ManyToManyField`\s (:ticket:`24513`).
+
+* Fixed a crash with ``QuerySet.update()`` on foreign keys to one-to-one fields
+ (:ticket:`24578`).
diff --git a/tests/one_to_one/tests.py b/tests/one_to_one/tests.py
index 2cda25b0aa..420d55da38 100644
--- a/tests/one_to_one/tests.py
+++ b/tests/one_to_one/tests.py
@@ -468,3 +468,14 @@ class OneToOneTests(TestCase):
# refs #21563
self.assertFalse(hasattr(Director(), 'director'))
self.assertFalse(hasattr(School(), 'school'))
+
+ def test_update_one_to_one_pk(self):
+ p1 = Place.objects.create()
+ p2 = Place.objects.create()
+ r1 = Restaurant.objects.create(place=p1)
+ r2 = Restaurant.objects.create(place=p2)
+ w = Waiter.objects.create(restaurant=r1)
+
+ Waiter.objects.update(restaurant=r2)
+ w.refresh_from_db()
+ self.assertEqual(w.restaurant, r2)