diff options
| author | Matthias Kestenholz <mk@feinheit.ch> | 2020-01-30 18:08:56 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2020-01-31 09:07:58 +0100 |
| commit | 4e8d89020cca87fcf484eb6b6b514b4c9bfa592f (patch) | |
| tree | 754224a36ca246ab1b3288bb3be0bd97cd41f5d8 | |
| parent | 8c0c0235b6a23a0d69cd77286d0212de90d4af44 (diff) | |
Fixed #31219 -- Fixed object deletion crash for nested protected related objects.
| -rw-r--r-- | django/db/models/deletion.py | 5 | ||||
| -rw-r--r-- | tests/delete/tests.py | 11 |
2 files changed, 12 insertions, 4 deletions
diff --git a/django/db/models/deletion.py b/django/db/models/deletion.py index 3385ed85c7..16dff6a1cd 100644 --- a/django/db/models/deletion.py +++ b/django/db/models/deletion.py @@ -296,10 +296,7 @@ class Collector: try: field.remote_field.on_delete(self, field, sub_objs, self.using) except ProtectedError as error: - key = "'%s.%s'" % ( - error.protected_objects[0].__class__.__name__, - field.name, - ) + key = "'%s.%s'" % (field.model.__name__, field.name) protected_objects[key] += error.protected_objects if protected_objects: raise ProtectedError( diff --git a/tests/delete/tests.py b/tests/delete/tests.py index 279788d2d3..1731342bc1 100644 --- a/tests/delete/tests.py +++ b/tests/delete/tests.py @@ -90,6 +90,17 @@ class OnDeleteTests(TestCase): with self.assertRaisesMessage(ProtectedError, msg): a.protect.delete() + def test_protect_path(self): + a = create_a('protect') + a.protect.p = P.objects.create() + a.protect.save() + msg = ( + "Cannot delete some instances of model 'P' because they are " + "referenced through protected foreign keys: 'R.p'." + ) + with self.assertRaisesMessage(ProtectedError, msg): + a.protect.p.delete() + def test_do_nothing(self): # Testing DO_NOTHING is a bit harder: It would raise IntegrityError for a normal model, # so we connect to pre_delete and set the fk to a known value. |
