diff options
| author | Egidijus Macijauskas <e.macijauskas@outlook.com> | 2021-02-09 23:43:01 +0200 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-02-11 09:09:59 +0100 |
| commit | aa1aed923b391b56d514be499c4ddf4b5110b377 (patch) | |
| tree | 20b3abbce49351de4b37799516ed977af5decfe1 | |
| parent | 98ce39b5a35c9d47b6c34764152fb3b1d2569c3e (diff) | |
[3.2.x] Fixed #32433 -- Added error message on QuerySet.delete() following distinct().
Backport of 6307c3f1a123f5975c73b231e8ac4f115fd72c0d from master
| -rw-r--r-- | AUTHORS | 1 | ||||
| -rw-r--r-- | django/db/models/query.py | 2 | ||||
| -rw-r--r-- | tests/delete_regress/tests.py | 13 |
3 files changed, 15 insertions, 1 deletions
@@ -274,6 +274,7 @@ answer newbie questions, and generally made Django that much better: dusk@woofle.net Dustyn Gibson <miigotu@gmail.com> Ed Morley <https://github.com/edmorley> + Egidijus Macijauskas <e.macijauskas@outlook.com> eibaan@gmail.com elky <http://elky.me/> Emmanuelle Delescolle <https://github.com/nanuxbe> 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() |
