diff --git a/django/db/models/deletion.py b/django/db/models/deletion.py
index 9a6d499..5a5370f 100644
--- a/django/db/models/deletion.py
+++ b/django/db/models/deletion.py
@@ -201,7 +201,9 @@ class Collector(object):
             for model in models:
                 if model in sorted_models:
                     continue
-                dependencies = self.dependencies.get(model)
+                # Dependencies keys are not proxy models
+                base_model = model._meta.proxy and model._meta.proxy_for_model or model
+                dependencies = self.dependencies.get(base_model)
                 if not (dependencies and dependencies.difference(sorted_models)):
                     sorted_models.append(model)
                     found = True
diff --git a/tests/modeltests/proxy_models/models.py b/tests/modeltests/proxy_models/models.py
index c033117..7c0d899 100644
--- a/tests/modeltests/proxy_models/models.py
+++ b/tests/modeltests/proxy_models/models.py
@@ -4,6 +4,7 @@ they will take data directly from the table of their base class table rather
 than using a new table of their own. This allows them to act as simple proxies,
 providing a modified interface to the data from the base class.
 """
+from django.contrib.auth.models import User as AuthUser
 from django.db import models
 
 # A couple of managers for testing managing overriding in proxy model cases.
@@ -158,4 +159,12 @@ class Improvement(Issue):
 
 class ProxyImprovement(Improvement):
     class Meta:
-        proxy = True
\ No newline at end of file
+        proxy = True
+
+
+class AuthUserProxy(AuthUser):
+    class Meta:
+        proxy = True
+
+class Profile(models.Model):
+    user = models.ForeignKey(AuthUser)
diff --git a/tests/modeltests/proxy_models/tests.py b/tests/modeltests/proxy_models/tests.py
index 0a46a25..226369d 100644
--- a/tests/modeltests/proxy_models/tests.py
+++ b/tests/modeltests/proxy_models/tests.py
@@ -11,6 +11,7 @@ from models import MyPersonProxy, Abstract, OtherPerson, User, UserProxy
 from models import UserProxyProxy, Country, State, StateProxy, TrackerUser
 from models import BaseUser, Bug, ProxyTrackerUser, Improvement, ProxyProxyBug
 from models import ProxyBug, ProxyImprovement
+from models import AuthUser, AuthUserProxy, Profile
 
 class ProxyModelTests(TestCase):
     def test_same_manager_queries(self):
@@ -312,3 +313,13 @@ class ProxyModelTests(TestCase):
         management.call_command('loaddata', 'mypeople.json', verbosity=0, commit=False)
         p = MyPerson.objects.get(pk=100)
         self.assertEqual(p.name, 'Elvis Presley')
+
+    def test_delete_cascade_to_proxy_objects(self):
+        """
+        Test that delete() cascades to proxy objects. Regression for #16128.
+        """
+        proxy_joe = AuthUserProxy.objects.create()
+        joe_s_profile = Profile.objects.create(user=proxy_joe)
+        self.assertEqual(Profile.objects.count(), 1)
+        proxy_joe.delete()
+        self.assertEqual(Profile.objects.count(), 0)
