diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index b1fcbceb5e..b198669acd 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -1858,6 +1858,8 @@ class InlineModelAdmin(BaseModelAdmin):
                 if self.cleaned_data.get(DELETION_FIELD_NAME, False):
                     using = router.db_for_write(self._meta.model)
                     collector = NestedObjects(using=using)
+                    if self.instance.pk is None:
+                        return
                     collector.collect([self.instance])
                     if collector.protected:
                         objs = []
diff --git a/docs/releases/1.7.2.txt b/docs/releases/1.7.2.txt
index ad2068044e..df66a505b4 100644
--- a/docs/releases/1.7.2.txt
+++ b/docs/releases/1.7.2.txt
@@ -121,3 +121,6 @@ Bugfixes
   model (:ticket:`23956`).
 
 * Fixed a crash when a ``MultiValueField`` has invalid data (:ticket:`23674`).
+
+* Fixed a crash in the admin when using "Save as new" and also deleting a
+  related inline (:ticket:`23857`).
diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py
index 2eedae7ea6..2e5dcb4f37 100644
--- a/tests/admin_views/tests.py
+++ b/tests/admin_views/tests.py
@@ -250,6 +250,23 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
         response = self.client.post('/test_admin/%s/admin_views/section/1/' % self.urlbit, post_data)
         self.assertEqual(response.status_code, 302)  # redirect somewhere
 
+    def test_edit_save_as_delete_inline(self):
+        """
+        Should be able to "Save as new" while also deleting an inline.
+        """
+        post_data = self.inline_post_data.copy()
+        post_data.update({
+            '_saveasnew': 'Save+as+new',
+            "article_set-1-section": "1",
+            "article_set-2-section": "1",
+            "article_set-2-DELETE": "1",
+            "article_set-3-section": "1",
+        })
+        response = self.client.post('/test_admin/%s/admin_views/section/1/' % self.urlbit, post_data)
+        self.assertEqual(response.status_code, 302)
+        # started with 3 articles, one was deleted.
+        self.assertEqual(Section.objects.latest('id').article_set.count(), 2)
+
     def test_change_list_sorting_callable(self):
         """
         Ensure we can sort on a list_display field that is a callable