Commit bc06d2c1 authored by Andrew Torpedov's avatar Andrew Torpedov Committed by Tim Graham
Browse files

Fixed #23313 -- Corrected repr(RawQuery) with dict parameters.

parent 909015a5
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -1596,10 +1596,7 @@ class RawQuerySet(object):
                self.query.cursor.close()

    def __repr__(self):
        text = self.raw_query
        if self.params:
            text = text % (self.params if hasattr(self.params, 'keys') else tuple(self.params))
        return "<RawQuerySet: %r>" % text
        return "<RawQuerySet: %s>" % self.query

    def __getitem__(self, k):
        return list(self)[k]
+6 −2
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@ databases). The abstraction barrier only works one way: this module has to know
all about the internals of models in order to get the information it needs.
"""

from collections import OrderedDict
from collections import Mapping, OrderedDict
import copy
import warnings

@@ -83,7 +83,11 @@ class RawQuery(object):
        return iter(result)

    def __repr__(self):
        return "<RawQuery: %r>" % (self.sql % tuple(self.params))
        return "<RawQuery: %s>" % self

    def __str__(self):
        _type = dict if isinstance(self.params, Mapping) else tuple
        return self.sql % _type(self.params)

    def _execute_query(self):
        self.cursor = connections[self.using].cursor()
+3 −3
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@ from django.db.models import Count, F, Q
from django.db.models.sql.where import WhereNode, EverythingNode, NothingNode
from django.db.models.sql.datastructures import EmptyResultSet
from django.test import TestCase, skipUnlessDBFeature
from django.test.utils import str_prefix, CaptureQueriesContext
from django.test.utils import CaptureQueriesContext
from django.utils.deprecation import RemovedInDjango19Warning
from django.utils import six

@@ -1846,12 +1846,12 @@ class RawQueriesTests(TestCase):
        query = "SELECT * FROM queries_note WHERE note = %s"
        params = ['n1']
        qs = Note.objects.raw(query, params=params)
        self.assertEqual(repr(qs), str_prefix("<RawQuerySet: %(_)s'SELECT * FROM queries_note WHERE note = n1'>"))
        self.assertEqual(repr(qs), "<RawQuerySet: SELECT * FROM queries_note WHERE note = n1>")

        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), str_prefix("<RawQuerySet: %(_)s'SELECT * FROM queries_note WHERE note = n1 and misc = foo'>"))
        self.assertEqual(repr(qs), "<RawQuerySet: SELECT * FROM queries_note WHERE note = n1 and misc = foo>")


class GeneratorExpressionTests(TestCase):
+14 −0
Original line number Diff line number Diff line
@@ -149,6 +149,20 @@ class RawQueryTests(TestCase):
        self.assertEqual(len(results), 1)
        self.assertIsInstance(repr(qset), str)

    def test_query_representation(self):
        """
        Test representation of raw query with parameters
        """
        query = "SELECT * FROM raw_query_author WHERE last_name = %(last)s"
        qset = Author.objects.raw(query, {'last': 'foo'})
        self.assertEqual(repr(qset), "<RawQuerySet: SELECT * FROM raw_query_author WHERE last_name = foo>")
        self.assertEqual(repr(qset.query), "<RawQuery: SELECT * FROM raw_query_author WHERE last_name = foo>")

        query = "SELECT * FROM raw_query_author WHERE last_name = %s"
        qset = Author.objects.raw(query, {'foo'})
        self.assertEqual(repr(qset), "<RawQuerySet: SELECT * FROM raw_query_author WHERE last_name = foo>")
        self.assertEqual(repr(qset.query), "<RawQuery: SELECT * FROM raw_query_author WHERE last_name = foo>")

    def test_many_to_many(self):
        """
        Test of a simple raw query against a model containing a m2m field