From 290c9d665490d80b0a1b648fb022190d7dc375fc Mon Sep 17 00:00:00 2001 From: Abhaya Agarwal Date: Wed, 13 May 2015 02:34:56 +0530 Subject: [PATCH] [1.8.x] Fixed #24698, #24712 -- Added ForeignKey.get_db_prep_value() Fixed crashes with ForeignKey to UUIDField and inheritance with UUIDField primary keys. --- django/db/models/fields/related.py | 3 +++ docs/releases/1.8.2.txt | 5 +++++ tests/model_fields/models.py | 8 ++++++++ tests/model_fields/test_uuid.py | 7 ++++++- 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index a499fef136..6fa46954e0 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -1939,6 +1939,9 @@ class ForeignKey(ForeignObject): else: return self.related_field.get_db_prep_save(value, connection=connection) + def get_db_prep_value(self, value, connection, prepared=False): + return self.related_field.get_db_prep_value(value, connection, prepared) + def value_to_string(self, obj): if not obj: # In required many-to-one fields with only one available choice, diff --git a/docs/releases/1.8.2.txt b/docs/releases/1.8.2.txt index bf54aeefd4..457dac4034 100644 --- a/docs/releases/1.8.2.txt +++ b/docs/releases/1.8.2.txt @@ -20,3 +20,8 @@ Bugfixes * Fixed incorrect GROUP BY clause generation on MySQL when the query's model has a self-referential foreign key (:ticket:`24748`). + +* Implemented ``ForeignKey.get_db_prep_value()`` so that ``ForeignKey``\s + pointing to :class:`~django.db.models.UUIDField` and inheritance on models + with ``UUIDField`` primary keys work correctly (:ticket:`24698`, + :ticket:`24712`). diff --git a/tests/model_fields/models.py b/tests/model_fields/models.py index 620fa9ec5d..2141610b0e 100644 --- a/tests/model_fields/models.py +++ b/tests/model_fields/models.py @@ -375,3 +375,11 @@ class PrimaryKeyUUIDModel(models.Model): class RelatedToUUIDModel(models.Model): uuid_fk = models.ForeignKey('PrimaryKeyUUIDModel') + + +class UUIDChild(PrimaryKeyUUIDModel): + pass + + +class UUIDGrandchild(UUIDChild): + pass diff --git a/tests/model_fields/test_uuid.py b/tests/model_fields/test_uuid.py index 7ce98a0852..21c2869edf 100644 --- a/tests/model_fields/test_uuid.py +++ b/tests/model_fields/test_uuid.py @@ -6,7 +6,8 @@ from django.db import models from django.test import TestCase from .models import ( - NullableUUIDModel, PrimaryKeyUUIDModel, RelatedToUUIDModel, UUIDModel, + NullableUUIDModel, PrimaryKeyUUIDModel, RelatedToUUIDModel, UUIDGrandchild, + UUIDModel, ) @@ -146,3 +147,7 @@ class TestAsPrimaryKey(TestCase): RelatedToUUIDModel.objects.update(uuid_fk=u2.pk) r.refresh_from_db() self.assertEqual(r.uuid_fk, u2) + + def test_two_level_foreign_keys(self): + # exercises ForeignKey.get_db_prep_value() + UUIDGrandchild().save()