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
This commit is contained in:
parent
7b47609629
commit
040c18b17e
|
@ -429,13 +429,14 @@ class QuerySet(object):
|
||||||
# Delete objects in chunks to prevent the list of related objects from
|
# Delete objects in chunks to prevent the list of related objects from
|
||||||
# becoming too long.
|
# becoming too long.
|
||||||
seen_objs = None
|
seen_objs = None
|
||||||
|
del_itr = iter(del_query)
|
||||||
while 1:
|
while 1:
|
||||||
# Collect a chunk of objects to be deleted, and then all the
|
# Collect a chunk of objects to be deleted, and then all the
|
||||||
# objects that are related to the objects that are to be deleted.
|
# objects that are related to the objects that are to be deleted.
|
||||||
# The chunking *isn't* done by slicing the del_query because we
|
# The chunking *isn't* done by slicing the del_query because we
|
||||||
# need to maintain the query cache on del_query (see #12328)
|
# need to maintain the query cache on del_query (see #12328)
|
||||||
seen_objs = CollectedObjects(seen_objs)
|
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)
|
obj._collect_sub_objects(seen_objs)
|
||||||
|
|
||||||
if not seen_objs:
|
if not seen_objs:
|
||||||
|
|
|
@ -106,3 +106,11 @@ class DeleteCascadeTests(TestCase):
|
||||||
self.assertEquals(PlayedWith.objects.count(), 0)
|
self.assertEquals(PlayedWith.objects.count(), 0)
|
||||||
# first two asserts just sanity checks, this is the kicker:
|
# first two asserts just sanity checks, this is the kicker:
|
||||||
self.assertEquals(PlayedWithNote.objects.count(), 0)
|
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)
|
||||||
|
|
Loading…
Reference in New Issue