Commit 211486f3 authored by Simon Charette's avatar Simon Charette
Browse files

Fixed #23076, #25505 -- Fixed deletion of intermediate proxy models.

Thanks to James Murty for his work on an alternate patch.
parent 8bdfabed
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ def get_candidate_relations_to_delete(opts):
    # The candidate relations are the ones that come from N-1 and 1-1 relations.
    # N-N  (i.e., many-to-many) relations aren't candidates for deletion.
    return (
        f for f in opts.get_fields(include_hidden=True)
        f for f in opts.concrete_model._meta.get_fields(include_hidden=True)
        if f.auto_created and not f.concrete and (f.one_to_one or f.one_to_many)
    )

+6 −1
Original line number Diff line number Diff line
@@ -6,7 +6,12 @@ class ConcreteModel(models.Model):
    pass


class ConcreteModelSubclass(ConcreteModel):
class ProxyModel(ConcreteModel):
    class Meta:
        proxy = True


class ConcreteModelSubclass(ProxyModel):
    pass


+8 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ from django.utils._os import upath

from .models import (
    ConcreteModel, ConcreteModelSubclass, ConcreteModelSubclassProxy,
    ProxyModel,
)


@@ -43,3 +44,10 @@ class MultiTableInheritanceProxyTest(TestCase):
        self.assertEqual(0, ConcreteModelSubclassProxy.objects.count())
        self.assertEqual(0, ConcreteModelSubclass.objects.count())
        self.assertEqual(0, ConcreteModel.objects.count())

    def test_deletion_through_intermediate_proxy(self):
        child = ConcreteModelSubclass.objects.create()
        proxy = ProxyModel.objects.get(pk=child.pk)
        proxy.delete()
        self.assertFalse(ConcreteModel.objects.exists())
        self.assertFalse(ConcreteModelSubclass.objects.exists())