summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay Wineinger <jay.wineinger@gmail.com>2015-04-09 13:47:05 -0500
committerTim Graham <timograham@gmail.com>2015-04-13 12:20:41 -0400
commit496800b3bf4460e697dee942696eaee5c56f87a0 (patch)
tree47d0854e08b84843162b70308dcf22d9afd6ee82
parent39282704953ea74dd82963a0d983aaec87826d66 (diff)
[1.8.x] Fixed #24611 -- Fixed update() crash with related UUID pk object.
Backport of 923da0274a9a8c4ef2ac9776f71bd14628e39fc3 from master
-rw-r--r--AUTHORS1
-rw-r--r--django/db/models/sql/compiler.py5
-rw-r--r--docs/releases/1.8.1.txt3
-rw-r--r--tests/model_fields/test_uuid.py17
4 files changed, 25 insertions, 1 deletions
diff --git a/AUTHORS b/AUTHORS
index 1102f36028..3e83984e6f 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -311,6 +311,7 @@ answer newbie questions, and generally made Django that much better:
Jason Yan <tailofthesun@gmail.com>
Javier Mansilla <javimansilla@gmail.com>
Jay Parlar <parlar@gmail.com>
+ Jay Wineinger <jay.wineinger@gmail.com>
J. Clifford Dyer <jcd@sdf.lonestar.org>
jcrasta@gmail.com
jdetaeye
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py
index 136d066ec3..f1bb10e228 100644
--- a/django/db/models/sql/compiler.py
+++ b/django/db/models/sql/compiler.py
@@ -1006,7 +1006,10 @@ class SQLUpdateCompiler(SQLCompiler):
raise FieldError("Aggregate functions are not allowed in this query")
elif hasattr(val, 'prepare_database_save'):
if field.rel:
- val = val.prepare_database_save(field)
+ val = field.get_db_prep_save(
+ val.prepare_database_save(field),
+ connection=self.connection,
+ )
else:
raise TypeError("Database is trying to update a relational field "
"of type %s with a value of type %s. Make sure "
diff --git a/docs/releases/1.8.1.txt b/docs/releases/1.8.1.txt
index d942d32842..988a532a89 100644
--- a/docs/releases/1.8.1.txt
+++ b/docs/releases/1.8.1.txt
@@ -38,3 +38,6 @@ Bugfixes
* Prevented arbitrary file inclusions in :mod:`~django.contrib.admindocs`
(:ticket:`24625`).
+
+* Fixed a crash with ``QuerySet.update()`` on foreign keys to instances with
+ ``uuid`` primary keys (:ticket:`24611`).
diff --git a/tests/model_fields/test_uuid.py b/tests/model_fields/test_uuid.py
index 28e11914a1..7ce98a0852 100644
--- a/tests/model_fields/test_uuid.py
+++ b/tests/model_fields/test_uuid.py
@@ -129,3 +129,20 @@ class TestAsPrimaryKey(TestCase):
RelatedToUUIDModel.objects.create(uuid_fk=pk_model)
related = RelatedToUUIDModel.objects.get()
self.assertEqual(related.uuid_fk.pk, related.uuid_fk_id)
+
+ def test_update_with_related_model_instance(self):
+ # regression for #24611
+ u1 = PrimaryKeyUUIDModel.objects.create()
+ u2 = PrimaryKeyUUIDModel.objects.create()
+ r = RelatedToUUIDModel.objects.create(uuid_fk=u1)
+ RelatedToUUIDModel.objects.update(uuid_fk=u2)
+ r.refresh_from_db()
+ self.assertEqual(r.uuid_fk, u2)
+
+ def test_update_with_related_model_id(self):
+ u1 = PrimaryKeyUUIDModel.objects.create()
+ u2 = PrimaryKeyUUIDModel.objects.create()
+ r = RelatedToUUIDModel.objects.create(uuid_fk=u1)
+ RelatedToUUIDModel.objects.update(uuid_fk=u2.pk)
+ r.refresh_from_db()
+ self.assertEqual(r.uuid_fk, u2)