瀏覽代碼

Refs #28876 -- Fixed incorrect foreign key constraint name for models with quoted db_table.

Thanks Simon Charette and Tim Graham for the review and Carlos E. C.
Leite for the report.
Mariusz Felisiak 7 年之前
父節點
當前提交
fc48047586
共有 4 個文件被更改,包括 31 次插入3 次删除
  1. 3 3
      django/db/backends/base/schema.py
  2. 3 0
      docs/releases/1.11.9.txt
  3. 3 0
      docs/releases/2.0.1.txt
  4. 22 0
      tests/schema/tests.py

+ 3 - 3
django/db/backends/base/schema.py

@@ -966,7 +966,7 @@ class BaseDatabaseSchemaEditor:
     def _create_fk_sql(self, model, field, suffix):
         from_table = model._meta.db_table
         from_column = field.column
-        to_table = field.target_field.model._meta.db_table
+        _, to_table = split_identifier(field.target_field.model._meta.db_table)
         to_column = field.target_field.column
 
         def create_fk_name(*args, **kwargs):
@@ -977,8 +977,8 @@ class BaseDatabaseSchemaEditor:
             table=Table(from_table, self.quote_name),
             name=ForeignKeyName(from_table, [from_column], to_table, [to_column], suffix, create_fk_name),
             column=Columns(from_table, [from_column], self.quote_name),
-            to_table=Table(to_table, self.quote_name),
-            to_column=Columns(to_table, [to_column], self.quote_name),
+            to_table=Table(field.target_field.model._meta.db_table, self.quote_name),
+            to_column=Columns(field.target_field.model._meta.db_table, [to_column], self.quote_name),
             deferrable=self.connection.ops.deferrable_sql(),
         )
 

+ 3 - 0
docs/releases/1.11.9.txt

@@ -14,3 +14,6 @@ Bugfixes
 
 * Fixed incorrect class-based model index name generation for models with
   quoted ``db_table`` (:ticket:`28876`).
+
+* Fixed incorrect foreign key constraint name for models with quoted
+  ``db_table`` (:ticket:`28876`).

+ 3 - 0
docs/releases/2.0.1.txt

@@ -14,3 +14,6 @@ Bugfixes
 
 * Fixed incorrect class-based model index name generation for models with
   quoted ``db_table`` (:ticket:`28876`).
+
+* Fixed incorrect foreign key constraint name for models with quoted
+  ``db_table`` (:ticket:`28876`).

+ 22 - 0
tests/schema/tests.py

@@ -1914,6 +1914,28 @@ class SchemaTests(TransactionTestCase):
         with connection.schema_editor() as editor:
             editor.add_field(BookWithLongName, new_field)
 
+    @isolate_apps('schema')
+    @skipUnlessDBFeature('supports_foreign_keys')
+    def test_add_foreign_key_quoted_db_table(self):
+        class Author(Model):
+            class Meta:
+                db_table = '"table_author_double_quoted"'
+                app_label = 'schema'
+
+        class Book(Model):
+            author = ForeignKey(Author, CASCADE)
+
+            class Meta:
+                app_label = 'schema'
+
+        with connection.schema_editor() as editor:
+            editor.create_model(Author)
+            editor.create_model(Book)
+        if connection.vendor == 'mysql':
+            self.assertForeignKeyExists(Book, 'author_id', '"table_author_double_quoted"')
+        else:
+            self.assertForeignKeyExists(Book, 'author_id', 'table_author_double_quoted')
+
     def test_add_foreign_object(self):
         with connection.schema_editor() as editor:
             editor.create_model(BookForeignObj)