diff --git a/django/db/models/sql/subqueries.py b/django/db/models/sql/subqueries.py index 35c814f903d..266b6a017cc 100644 --- a/django/db/models/sql/subqueries.py +++ b/django/db/models/sql/subqueries.py @@ -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() diff --git a/docs/releases/1.9.1.txt b/docs/releases/1.9.1.txt index bc4a0be8adf..eee5a887377 100644 --- a/docs/releases/1.9.1.txt +++ b/docs/releases/1.9.1.txt @@ -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`). diff --git a/tests/delete/tests.py b/tests/delete/tests.py index 663a22791b2..1a8941904c2 100644 --- a/tests/delete/tests.py +++ b/tests/delete/tests.py @@ -503,3 +503,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}) + )