mirror of
https://github.com/django/django.git
synced 2025-11-07 07:15:35 +00:00
Fixed #36661 -- Added introspection of database-level delete options.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
from django.db import DatabaseError, connection
|
||||
from django.db.models import Index
|
||||
from django.db.models import DB_CASCADE, DB_SET_DEFAULT, DB_SET_NULL, DO_NOTHING, Index
|
||||
from django.test import TransactionTestCase, skipUnlessDBFeature
|
||||
|
||||
from .models import (
|
||||
@@ -10,6 +10,8 @@ from .models import (
|
||||
Comment,
|
||||
Country,
|
||||
DbCommentModel,
|
||||
DbOnDeleteModel,
|
||||
DbOnDeleteSetDefaultModel,
|
||||
District,
|
||||
Reporter,
|
||||
UniqueConstraintConditionModel,
|
||||
@@ -219,10 +221,14 @@ class IntrospectionTests(TransactionTestCase):
|
||||
cursor, Article._meta.db_table
|
||||
)
|
||||
|
||||
# That's {field_name: (field_name_other_table, other_table)}
|
||||
if connection.vendor == "mysql" and connection.mysql_is_mariadb:
|
||||
no_db_on_delete = None
|
||||
else:
|
||||
no_db_on_delete = DO_NOTHING
|
||||
# {field_name: (field_name_other_table, other_table, db_on_delete)}
|
||||
expected_relations = {
|
||||
"reporter_id": ("id", Reporter._meta.db_table),
|
||||
"response_to_id": ("id", Article._meta.db_table),
|
||||
"reporter_id": ("id", Reporter._meta.db_table, no_db_on_delete),
|
||||
"response_to_id": ("id", Article._meta.db_table, no_db_on_delete),
|
||||
}
|
||||
self.assertEqual(relations, expected_relations)
|
||||
|
||||
@@ -238,6 +244,38 @@ class IntrospectionTests(TransactionTestCase):
|
||||
editor.add_field(Article, body)
|
||||
self.assertEqual(relations, expected_relations)
|
||||
|
||||
@skipUnlessDBFeature("can_introspect_foreign_keys")
|
||||
def test_get_relations_db_on_delete(self):
|
||||
with connection.cursor() as cursor:
|
||||
relations = connection.introspection.get_relations(
|
||||
cursor, DbOnDeleteModel._meta.db_table
|
||||
)
|
||||
|
||||
if connection.vendor == "mysql" and connection.mysql_is_mariadb:
|
||||
no_db_on_delete = None
|
||||
else:
|
||||
no_db_on_delete = DO_NOTHING
|
||||
# {field_name: (field_name_other_table, other_table, db_on_delete)}
|
||||
expected_relations = {
|
||||
"fk_db_cascade_id": ("id", City._meta.db_table, DB_CASCADE),
|
||||
"fk_do_nothing_id": ("id", Country._meta.db_table, no_db_on_delete),
|
||||
"fk_set_null_id": ("id", Reporter._meta.db_table, DB_SET_NULL),
|
||||
}
|
||||
self.assertEqual(relations, expected_relations)
|
||||
|
||||
@skipUnlessDBFeature("can_introspect_foreign_keys", "supports_on_delete_db_default")
|
||||
def test_get_relations_db_on_delete_default(self):
|
||||
with connection.cursor() as cursor:
|
||||
relations = connection.introspection.get_relations(
|
||||
cursor, DbOnDeleteSetDefaultModel._meta.db_table
|
||||
)
|
||||
|
||||
# {field_name: (field_name_other_table, other_table, db_on_delete)}
|
||||
expected_relations = {
|
||||
"fk_db_set_default_id": ("id", Country._meta.db_table, DB_SET_DEFAULT),
|
||||
}
|
||||
self.assertEqual(relations, expected_relations)
|
||||
|
||||
def test_get_primary_key_column(self):
|
||||
with connection.cursor() as cursor:
|
||||
primary_key_column = connection.introspection.get_primary_key_column(
|
||||
|
||||
Reference in New Issue
Block a user