diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index ffd5af6c15..9e54b97374 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -431,7 +431,8 @@ class Query(object): def has_results(self, using): q = self.clone() - q.clear_select_clause() + if not q.distinct: + q.clear_select_clause() q.clear_ordering(True) q.set_limits(high=1) compiler = q.get_compiler(using=using) diff --git a/tests/queries/tests.py b/tests/queries/tests.py index 4739e21540..6930f3093d 100644 --- a/tests/queries/tests.py +++ b/tests/queries/tests.py @@ -1856,6 +1856,25 @@ class ExistsSql(TestCase): id, name = connection.ops.quote_name('id'), connection.ops.quote_name('name') self.assertTrue(id not in qstr and name not in qstr) + def test_ticket_18414(self): + Article.objects.create(name='one', created=datetime.datetime.now()) + Article.objects.create(name='one', created=datetime.datetime.now()) + Article.objects.create(name='two', created=datetime.datetime.now()) + self.assertTrue(Article.objects.exists()) + self.assertTrue(Article.objects.distinct().exists()) + self.assertTrue(Article.objects.distinct()[1:3].exists()) + self.assertFalse(Article.objects.distinct()[1:1].exists()) + + @unittest.skipUnless(connection.features.can_distinct_on_fields, + 'Uses distinct(fields)') + def test_ticket_18414_distinct_on(self): + Article.objects.create(name='one', created=datetime.datetime.now()) + Article.objects.create(name='one', created=datetime.datetime.now()) + Article.objects.create(name='two', created=datetime.datetime.now()) + self.assertTrue(Article.objects.distinct('name').exists()) + self.assertTrue(Article.objects.distinct('name')[1:2].exists()) + self.assertFalse(Article.objects.distinct('name')[2:3].exists()) + class QuerysetOrderedTests(unittest.TestCase): """