diff --git a/django/db/models/query.py b/django/db/models/query.py index 09d960b3ec..9c3aeaa8d3 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -1385,7 +1385,7 @@ class RawQuerySet(object): yield instance def __repr__(self): - return "" % (self.raw_query % self.params) + return "" % (self.raw_query % tuple(self.params)) def __getitem__(self, k): return list(self)[k] diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index f41272cf0f..c29673ecdd 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -74,7 +74,7 @@ class RawQuery(object): return iter(result) def __repr__(self): - return "" % (self.sql % self.params) + return "" % (self.sql % tuple(self.params)) def _execute_query(self): self.cursor = connections[self.using].cursor() diff --git a/tests/regressiontests/queries/tests.py b/tests/regressiontests/queries/tests.py index c87ecd32df..31856ba3a6 100644 --- a/tests/regressiontests/queries/tests.py +++ b/tests/regressiontests/queries/tests.py @@ -1317,6 +1317,23 @@ class Queries6Tests(TestCase): self.assertIsNot(q1, q1.all()) +class RawQueriesTests(TestCase): + def setUp(self): + n1 = Note.objects.create(note='n1', misc='foo', id=1) + + def test_ticket14729(self): + # Test representation of raw query with one or few parameters passed as list + query = "SELECT * FROM queries_note WHERE note = %s" + params = ['n1'] + qs = Note.objects.raw(query, params=params) + self.assertEqual(repr(qs), "") + + query = "SELECT * FROM queries_note WHERE note = %s and misc = %s" + params = ['n1', 'foo'] + qs = Note.objects.raw(query, params=params) + self.assertEqual(repr(qs), "") + + class GeneratorExpressionTests(TestCase): def test_ticket10432(self): # Using an empty generator expression as the rvalue for an "__in"