Fixed #32068 -- Added error messages on get() with filters following union(), intersection(), and difference().

This commit is contained in:
Hasan Ramezani 2020-10-05 11:51:35 +02:00 committed by Mariusz Felisiak
parent 7cfa40d872
commit 981a3426cf
2 changed files with 18 additions and 0 deletions

View File

@ -416,6 +416,11 @@ class QuerySet:
Perform the query and return a single object matching the given
keyword arguments.
"""
if self.query.combinator and (args or kwargs):
raise NotSupportedError(
'Calling QuerySet.get(...) with filters after %s() is not '
'supported.' % self.query.combinator
)
clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs)
if self.query.can_filter() and not self.query.distinct_fields:
clone = clone.order_by()

View File

@ -341,3 +341,16 @@ class QuerySetSetOperationTests(TestCase):
msg % (operation, combinator),
):
getattr(getattr(qs, combinator)(qs), operation)()
def test_get_with_filters_unsupported_on_combined_qs(self):
qs = Number.objects.all()
msg = 'Calling QuerySet.get(...) with filters after %s() is not supported.'
combinators = ['union']
if connection.features.supports_select_difference:
combinators.append('difference')
if connection.features.supports_select_intersection:
combinators.append('intersection')
for combinator in combinators:
with self.subTest(combinator=combinator):
with self.assertRaisesMessage(NotSupportedError, msg % combinator):
getattr(qs, combinator)(qs).get(num=2)