Browse Source

Fixed #13309 -- Ensure that delete() deletes everything it should delete(). Thanks to craig.kimerer@gmail.com for the report.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12941 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Russell Keith-Magee 15 years ago
parent
commit
040c18b17e
2 changed files with 10 additions and 1 deletions
  1. 2 1
      django/db/models/query.py
  2. 8 0
      tests/regressiontests/delete_regress/tests.py

+ 2 - 1
django/db/models/query.py

@@ -429,13 +429,14 @@ class QuerySet(object):
         # Delete objects in chunks to prevent the list of related objects from
         # becoming too long.
         seen_objs = None
+        del_itr = iter(del_query)
         while 1:
             # Collect a chunk of objects to be deleted, and then all the
             # objects that are related to the objects that are to be deleted.
             # The chunking *isn't* done by slicing the del_query because we
             # need to maintain the query cache on del_query (see #12328)
             seen_objs = CollectedObjects(seen_objs)
-            for i, obj in izip(xrange(CHUNK_SIZE), del_query):
+            for i, obj in izip(xrange(CHUNK_SIZE), del_itr):
                 obj._collect_sub_objects(seen_objs)
 
             if not seen_objs:

+ 8 - 0
tests/regressiontests/delete_regress/tests.py

@@ -106,3 +106,11 @@ class DeleteCascadeTests(TestCase):
         self.assertEquals(PlayedWith.objects.count(), 0)
         # first two asserts just sanity checks, this is the kicker:
         self.assertEquals(PlayedWithNote.objects.count(), 0)
+
+class LargeDeleteTests(TestCase):
+    def test_large_deletes(self):
+        "Regression for #13309 -- if the number of objects > chunk size, deletion still occurs"
+        for x in range(300):
+            track = Book.objects.create(pagecount=x+100)
+        Book.objects.all().delete()
+        self.assertEquals(Book.objects.count(), 0)