From 8ed25d65ea7546fafd808086fa07e7e5bb5428fc Mon Sep 17 00:00:00 2001
From: Petter Friberg <petter_friberg@hotmail.com>
Date: Thu, 20 Apr 2023 15:19:44 +0200
Subject: [PATCH] Fixed #34505 -- Skipped varchar_pattern_ops/text_pattern_ops
 index creation when db_collation is set in related field.

---
 django/db/backends/postgresql/schema.py |  4 ++-
 tests/schema/tests.py                   | 36 +++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/django/db/backends/postgresql/schema.py b/django/db/backends/postgresql/schema.py
index 19f8b225e2..18899a6a2b 100644
--- a/django/db/backends/postgresql/schema.py
+++ b/django/db/backends/postgresql/schema.py
@@ -100,7 +100,9 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
                 return None
             # Non-deterministic collations on Postgresql don't support indexes
             # for operator classes varchar_pattern_ops/text_pattern_ops.
-            if getattr(field, "db_collation", None):
+            if getattr(field, "db_collation", None) or (
+                field.is_relation and getattr(field.target_field, "db_collation", None)
+            ):
                 return None
             if db_type.startswith("varchar"):
                 return self._create_index_sql(
diff --git a/tests/schema/tests.py b/tests/schema/tests.py
index 58c87904f7..d81a01b41d 100644
--- a/tests/schema/tests.py
+++ b/tests/schema/tests.py
@@ -1371,6 +1371,42 @@ class SchemaTests(TransactionTestCase):
         )
         self.assertIn("field", self.get_uniques(CiCharModel._meta.db_table))
 
+    @isolate_apps("schema")
+    @unittest.skipUnless(connection.vendor == "postgresql", "PostgreSQL specific")
+    @skipUnlessDBFeature(
+        "supports_collation_on_charfield",
+        "supports_non_deterministic_collations",
+    )
+    def test_relation_to_collation_charfield(self):
+        ci_collation = self._add_ci_collation()
+
+        class CiCharModel(Model):
+            field = CharField(max_length=16, db_collation=ci_collation, unique=True)
+
+            class Meta:
+                app_label = "schema"
+
+        class RelationModel(Model):
+            field = OneToOneField(CiCharModel, CASCADE, to_field="field")
+
+            class Meta:
+                app_label = "schema"
+
+        # Create the table.
+        with connection.schema_editor() as editor:
+            editor.create_model(CiCharModel)
+            editor.create_model(RelationModel)
+        self.isolated_local_models = [CiCharModel, RelationModel]
+        self.assertEqual(
+            self.get_column_collation(RelationModel._meta.db_table, "field_id"),
+            ci_collation,
+        )
+        self.assertEqual(
+            self.get_column_collation(CiCharModel._meta.db_table, "field"),
+            ci_collation,
+        )
+        self.assertIn("field_id", self.get_uniques(RelationModel._meta.db_table))
+
     def test_alter_textfield_to_null(self):
         """
         #24307 - Should skip an alter statement on databases with