浏览代码

Fixed #33982 -- Fixed migrations crash when adding model with ExclusionConstraint.

Regression in 0e656c02fe945389246f0c08f51c6db4a0849bd2.
James Beith 2 年之前
父节点
当前提交
19e838daa8
共有 3 个文件被更改,包括 30 次插入2 次删除
  1. 3 1
      django/db/backends/base/schema.py
  2. 2 1
      docs/releases/4.1.2.txt
  3. 25 0
      tests/postgres_tests/test_constraints.py

+ 3 - 1
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:

+ 2 - 1
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`).

+ 25 - 0
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):