From de0c7744be93800b2239eb061a2d8f7c669c05a8 Mon Sep 17 00:00:00 2001 From: David Wobrock Date: Mon, 6 Mar 2023 21:17:58 +0100 Subject: [PATCH] Refs #28329 -- Fixed Cast() with ForeignKey to integer fields on MySQL. --- django/db/models/fields/related.py | 3 +++ tests/db_functions/comparison/test_cast.py | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index b31fee7e89..0efbe53a0b 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -1162,6 +1162,9 @@ class ForeignKey(ForeignObject): def db_type(self, connection): return self.target_field.rel_db_type(connection=connection) + def cast_db_type(self, connection): + return self.target_field.cast_db_type(connection=connection) + def db_parameters(self, connection): target_db_parameters = self.target_field.db_parameters(connection) return { diff --git a/tests/db_functions/comparison/test_cast.py b/tests/db_functions/comparison/test_cast.py index afb6b473b9..80375cc389 100644 --- a/tests/db_functions/comparison/test_cast.py +++ b/tests/db_functions/comparison/test_cast.py @@ -76,6 +76,15 @@ class CastTests(TestCase): numbers = Author.objects.annotate(cast_int=Cast("alias", field_class())) self.assertEqual(numbers.get().cast_int, 1) + def test_cast_to_integer_foreign_key(self): + numbers = Author.objects.annotate( + cast_fk=Cast( + models.Value("0"), + models.ForeignKey(Author, on_delete=models.SET_NULL), + ) + ) + self.assertEqual(numbers.get().cast_fk, 0) + def test_cast_to_duration(self): duration = datetime.timedelta(days=1, seconds=2, microseconds=3) DTModel.objects.create(duration=duration)