diff options
| author | Tim Graham <timograham@gmail.com> | 2015-04-07 09:08:05 -0400 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2015-04-09 08:24:07 -0400 |
| commit | b1dc128a03fc586b42a0d9f26dfe0bc7655ea6e8 (patch) | |
| tree | 3bf0af341e5ce10ad5262c48659050dc3d012035 | |
| parent | d11e87bff50a9b53de2fe683740fb875d3d2d9e9 (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.py | 2 | ||||
| -rw-r--r-- | docs/releases/1.8.1.txt | 3 | ||||
| -rw-r--r-- | tests/one_to_one/tests.py | 11 |
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) |
