summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Beith <james@beith.co.uk>2022-09-07 13:53:37 +1000
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-09-07 09:17:23 +0200
commit7ba9a448316de976735c1b14d069ed033ebed6ea (patch)
treee1fd99f1361e60996c21e6e13224a1119f211050
parent4987ce33504fce35147ca416687323a7e1c9f2b3 (diff)
[4.1.x] Fixed #33982 -- Fixed migrations crash when adding model with ExclusionConstraint.
Regression in 0e656c02fe945389246f0c08f51c6db4a0849bd2. Backport of 19e838daa8872ee29fbea0bc471c2a6443f26835 from main
-rw-r--r--django/db/backends/base/schema.py4
-rw-r--r--docs/releases/4.1.2.txt3
-rw-r--r--tests/postgres_tests/test_constraints.py25
3 files changed, 30 insertions, 2 deletions
diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py
index dbc6e427a9..86883857fd 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 c5100542a4..2850d0eb3d 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
@@ -1166,6 +1168,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):