summaryrefslogtreecommitdiff
path: root/tests/delete
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2025-11-20 20:18:09 -0500
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2025-11-23 11:53:24 +0100
commit57c50d8c1996733cef45204ea069a2c01b2860cc (patch)
treeef25923bfc179acb84d09c934fe50ff565a6a929 /tests/delete
parentec60df6d1ea8939a316d9b180faa0b4ef2e83606 (diff)
Refs #21961 -- Added DatabaseFeatures.supports_on_delete_db_(cascade/null) feature flags.
Needed on MongoDB. Co-Authored-By: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Diffstat (limited to 'tests/delete')
-rw-r--r--tests/delete/models.py26
-rw-r--r--tests/delete/tests.py18
2 files changed, 24 insertions, 20 deletions
diff --git a/tests/delete/models.py b/tests/delete/models.py
index bd9caf42a7..d8f81827be 100644
--- a/tests/delete/models.py
+++ b/tests/delete/models.py
@@ -49,17 +49,26 @@ class RelatedDbOptionParent(models.Model):
p = models.ForeignKey(RelatedDbOptionGrandParent, models.DB_CASCADE, null=True)
-class RelatedDbOption(models.Model):
+class CascadeDbModel(models.Model):
name = models.CharField(max_length=30)
+ db_cascade = models.ForeignKey(
+ RelatedDbOptionParent, models.DB_CASCADE, related_name="db_cascade_set"
+ )
+
+ class Meta:
+ required_db_features = {"supports_on_delete_db_cascade"}
+
+
+class SetNullDbModel(models.Model):
db_setnull = models.ForeignKey(
RelatedDbOptionParent,
models.DB_SET_NULL,
null=True,
related_name="db_setnull_set",
)
- db_cascade = models.ForeignKey(
- RelatedDbOptionParent, models.DB_CASCADE, related_name="db_cascade_set"
- )
+
+ class Meta:
+ required_db_features = {"supports_on_delete_db_null"}
class SetDefaultDbModel(models.Model):
@@ -159,15 +168,6 @@ def create_a(name):
return a
-def create_related_db_option(name):
- a = RelatedDbOption(name=name)
- for name in ["db_setnull", "db_cascade"]:
- r = RelatedDbOptionParent.objects.create()
- setattr(a, name, r)
- a.save()
- return a
-
-
class M(models.Model):
m2m = models.ManyToManyField(R, related_name="m_set")
m2m_through = models.ManyToManyField(R, through="MR", related_name="m_through_set")
diff --git a/tests/delete/tests.py b/tests/delete/tests.py
index 8d525d1e5f..664cdfb440 100644
--- a/tests/delete/tests.py
+++ b/tests/delete/tests.py
@@ -15,6 +15,7 @@ from .models import (
Avatar,
B,
Base,
+ CascadeDbModel,
Child,
DeleteBottom,
DeleteTop,
@@ -34,16 +35,15 @@ from .models import (
RChild,
RChildChild,
Referrer,
- RelatedDbOption,
RelatedDbOptionGrandParent,
RelatedDbOptionParent,
RProxy,
S,
SetDefaultDbModel,
+ SetNullDbModel,
T,
User,
create_a,
- create_related_db_option,
get_default_r,
)
@@ -81,10 +81,13 @@ class OnDeleteTests(TestCase):
a = A.objects.get(pk=a.pk)
self.assertIsNone(a.setnull)
+ @skipUnlessDBFeature("supports_on_delete_db_null")
def test_db_setnull(self):
- a = create_related_db_option("db_setnull")
+ a = SetNullDbModel.objects.create(
+ db_setnull=RelatedDbOptionParent.objects.create()
+ )
a.db_setnull.delete()
- a = RelatedDbOption.objects.get(pk=a.pk)
+ a = SetNullDbModel.objects.get(pk=a.pk)
self.assertIsNone(a.db_setnull)
def test_setdefault(self):
@@ -394,20 +397,21 @@ class DeletionTests(TestCase):
self.assertNumQueries(5, s.delete)
self.assertFalse(S.objects.exists())
+ @skipUnlessDBFeature("supports_on_delete_db_cascade")
def test_db_cascade(self):
related_db_op = RelatedDbOptionParent.objects.create(
p=RelatedDbOptionGrandParent.objects.create()
)
- RelatedDbOption.objects.bulk_create(
+ CascadeDbModel.objects.bulk_create(
[
- RelatedDbOption(db_cascade=related_db_op)
+ CascadeDbModel(db_cascade=related_db_op)
for _ in range(2 * GET_ITERATOR_CHUNK_SIZE)
]
)
with self.assertNumQueries(1):
results = related_db_op.delete()
self.assertEqual(results, (1, {"delete.RelatedDbOptionParent": 1}))
- self.assertFalse(RelatedDbOption.objects.exists())
+ self.assertFalse(CascadeDbModel.objects.exists())
self.assertFalse(RelatedDbOptionParent.objects.exists())
def test_instance_update(self):