diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py index 09785e8586..bf2476a63e 100644 --- a/django/db/backends/base/schema.py +++ b/django/db/backends/base/schema.py @@ -269,7 +269,9 @@ class BaseDatabaseSchemaEditor: sql = self.sql_create_table % { "table": self.quote_name(model._meta.db_table), "definition": ", ".join( - constraint for constraint in (*column_sqls, *constraints) if constraint + str(constraint) + for constraint in (*column_sqls, *constraints) + if constraint ), } if model._meta.db_tablespace: diff --git a/docs/releases/4.1.2.txt b/docs/releases/4.1.2.txt index cbb96276ce..4659558f3d 100644 --- a/docs/releases/4.1.2.txt +++ b/docs/releases/4.1.2.txt @@ -9,4 +9,5 @@ Django 4.1.2 fixes several bugs in 4.1.1. Bugfixes ======== -* ... +* Fixed a regression in Django 4.1 that caused a migration crash on PostgreSQL + when adding a model with ``ExclusionConstraint`` (:ticket:`33982`). diff --git a/tests/postgres_tests/test_constraints.py b/tests/postgres_tests/test_constraints.py index a6f7b5be85..2b6df7d5f5 100644 --- a/tests/postgres_tests/test_constraints.py +++ b/tests/postgres_tests/test_constraints.py @@ -10,12 +10,14 @@ from django.db.models import ( F, Func, IntegerField, + Model, Q, UniqueConstraint, ) from django.db.models.fields.json import KeyTextTransform from django.db.models.functions import Cast, Left, Lower from django.test import ignore_warnings, modify_settings, skipUnlessDBFeature +from django.test.utils import isolate_apps from django.utils import timezone from django.utils.deprecation import RemovedInDjango50Warning @@ -1151,6 +1153,29 @@ class ExclusionConstraintTests(PostgreSQLTestCase): editor.add_constraint(Room, constraint) self.assertIn(constraint_name, self.get_constraints(Room._meta.db_table)) + @isolate_apps("postgres_tests") + def test_table_create(self): + constraint_name = "exclusion_equal_number_tc" + + class ModelWithExclusionConstraint(Model): + number = IntegerField() + + class Meta: + app_label = "postgres_tests" + constraints = [ + ExclusionConstraint( + name=constraint_name, + expressions=[("number", RangeOperators.EQUAL)], + ) + ] + + with connection.schema_editor() as editor: + editor.create_model(ModelWithExclusionConstraint) + self.assertIn( + constraint_name, + self.get_constraints(ModelWithExclusionConstraint._meta.db_table), + ) + @modify_settings(INSTALLED_APPS={"append": "django.contrib.postgres"}) class ExclusionConstraintOpclassesDepracationTests(PostgreSQLTestCase):