mirror of https://github.com/django/django.git
[1.9.x] Fixed #25882 -- Prevented fast deletes matching no rows from crashing on MySQL.
Thanks to Trac aliases gerricom for the report, raphaelmerx for the
attempts to reproduce and Sergey Fedoseev and Tim for the review.
Refs #16891
Backport of 8035cee922
from master
This commit is contained in:
parent
45ea00742b
commit
c402db2e2f
|
@ -68,7 +68,7 @@ class DeleteQuery(Query):
|
|||
# We can't do the delete using subquery.
|
||||
values = list(query.values_list('pk', flat=True))
|
||||
if not values:
|
||||
return
|
||||
return 0
|
||||
return self.delete_batch(values, using)
|
||||
else:
|
||||
innerq.clear_select_clause()
|
||||
|
|
|
@ -34,3 +34,6 @@ Bugfixes
|
|||
created by ``startapp`` on Python 2 (:ticket:`25909`). Add this line to your
|
||||
own ``apps.py`` files created using Django 1.9 if you want your migrations
|
||||
to work on both Python 2 and Python 3.
|
||||
|
||||
* Prevented ``QuerySet.delete()`` from crashing on MySQL when querying across
|
||||
relations (:ticket`25882`).
|
||||
|
|
|
@ -502,3 +502,15 @@ class FastDeleteTests(TestCase):
|
|||
# that + fast delete of the related objs.
|
||||
self.assertNumQueries(2, a.delete)
|
||||
self.assertEqual(User.objects.count(), 0)
|
||||
|
||||
def test_fast_delete_empty_no_update_can_self_select(self):
|
||||
"""
|
||||
#25932 - Fast deleting on backends that don't have the
|
||||
`no_update_can_self_select` feature should work even if the specified
|
||||
filter doesn't match any row.
|
||||
"""
|
||||
with self.assertNumQueries(1):
|
||||
self.assertEqual(
|
||||
User.objects.filter(avatar__desc='missing').delete(),
|
||||
(0, {'delete.User': 0})
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue