From 6307c3f1a123f5975c73b231e8ac4f115fd72c0d Mon Sep 17 00:00:00 2001 From: Egidijus Macijauskas Date: Tue, 9 Feb 2021 23:43:01 +0200 Subject: [PATCH] Fixed #32433 -- Added error message on QuerySet.delete() following distinct(). --- AUTHORS | 1 + django/db/models/query.py | 2 ++ tests/delete_regress/tests.py | 13 ++++++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index f5c71c7e30..68783f4cfd 100644 --- a/AUTHORS +++ b/AUTHORS @@ -274,6 +274,7 @@ answer newbie questions, and generally made Django that much better: dusk@woofle.net Dustyn Gibson Ed Morley + Egidijus Macijauskas eibaan@gmail.com elky Emmanuelle Delescolle diff --git a/django/db/models/query.py b/django/db/models/query.py index 32fee78e9f..02c1b31435 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -724,6 +724,8 @@ class QuerySet: assert not self.query.is_sliced, \ "Cannot use 'limit' or 'offset' with delete." + if self.query.distinct or self.query.distinct_fields: + raise TypeError('Cannot call delete() after .distinct().') if self._fields is not None: raise TypeError("Cannot call delete() after .values() or .values_list()") diff --git a/tests/delete_regress/tests.py b/tests/delete_regress/tests.py index e4fa59e89f..97a7d6ba02 100644 --- a/tests/delete_regress/tests.py +++ b/tests/delete_regress/tests.py @@ -1,7 +1,9 @@ import datetime from django.db import connection, models, transaction -from django.test import TestCase, TransactionTestCase, skipUnlessDBFeature +from django.test import ( + SimpleTestCase, TestCase, TransactionTestCase, skipUnlessDBFeature, +) from .models import ( Award, AwardNote, Book, Child, Contact, Eaten, Email, File, Food, FooFile, @@ -352,3 +354,12 @@ class DeleteTests(TestCase): self.assertEqual(researcher1.secondary_contact, contact2) self.assertEqual(researcher2.primary_contact, contact2) self.assertIsNone(researcher2.secondary_contact) + + +class DeleteDistinct(SimpleTestCase): + def test_disallowed_delete_distinct(self): + msg = 'Cannot call delete() after .distinct().' + with self.assertRaisesMessage(TypeError, msg): + Book.objects.distinct().delete() + with self.assertRaisesMessage(TypeError, msg): + Book.objects.distinct('id').delete()