summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Bronn <jbronn@gmail.com>2010-02-23 05:22:12 +0000
committerJustin Bronn <jbronn@gmail.com>2010-02-23 05:22:12 +0000
commitc4699b0b8a8503e552de1fe4f873685f7037b337 (patch)
tree63065345b6d2c3f170cbbdf5f9451f0cc2ede1db
parent349827996b5bcf29886bd1e57bc07147d840229e (diff)
Fixed #12806 -- Added an implementation of `RawQuerySet.__getitem__`. Thanks, Bruno Renié.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@12504 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--AUTHORS1
-rw-r--r--django/db/models/query.py3
-rw-r--r--django/db/models/sql/query.py2
-rw-r--r--docs/topics/db/sql.txt14
-rw-r--r--tests/modeltests/raw_query/tests.py17
5 files changed, 35 insertions, 2 deletions
diff --git a/AUTHORS b/AUTHORS
index 93cf2bdeb0..d60a9f72a5 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -503,6 +503,7 @@ answer newbie questions, and generally made Django that much better:
Cheng Zhang
Glenn Maynard <glenn@zewt.org>
bthomas
+ Bruno Renié <buburno@gmail.com>
A big THANK YOU goes to:
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 8cb3dbecfc..0424569e0b 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -1334,6 +1334,9 @@ class RawQuerySet(object):
def __repr__(self):
return "<RawQuerySet: %r>" % (self.raw_query % self.params)
+ def __getitem__(self, k):
+ return list(self)[k]
+
@property
def db(self):
"Return the database that will be used if this query is executed now"
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index 2d3f6109a0..7b1695e051 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -54,7 +54,7 @@ class RawQuery(object):
def __iter__(self):
# Always execute a new query for a new iterator.
- # This could be optomized with a cache at the expense of RAM.
+ # This could be optimized with a cache at the expense of RAM.
self._execute_query()
return iter(self.cursor)
diff --git a/docs/topics/db/sql.txt b/docs/topics/db/sql.txt
index 075b9b27a3..1433fa52a1 100644
--- a/docs/topics/db/sql.txt
+++ b/docs/topics/db/sql.txt
@@ -91,6 +91,20 @@ query could also be written::
>>> name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
>>> Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)
+Index lookups
+-------------
+
+``raw()`` supports indexing, so if you need only the first result you can
+write::
+
+ >>> first_person = Person.objects.raw('SELECT * from myapp_person')[0]
+
+However, the indexing and slicing are not performed at the database level. If
+you have a big amount of ``Person`` objects in your database, it would be more
+efficient to limit the query at the SQL level::
+
+ >>> first_person = Person.objects.raw('SELECT * from myapp_person LIMIT 1')[0]
+
Deferring model fields
----------------------
diff --git a/tests/modeltests/raw_query/tests.py b/tests/modeltests/raw_query/tests.py
index 688df21598..dbc5f88bb9 100644
--- a/tests/modeltests/raw_query/tests.py
+++ b/tests/modeltests/raw_query/tests.py
@@ -185,4 +185,19 @@ class RawQueryTests(TestCase):
self.assertEqual(normal_authors[index], raw_author)
second_iterations += 1
- self.assertEqual(first_iterations, second_iterations) \ No newline at end of file
+ self.assertEqual(first_iterations, second_iterations)
+
+ def testGetItem(self):
+ # Indexing on RawQuerySets
+ query = "SELECT * FROM raw_query_author ORDER BY id ASC"
+ third_author = Author.objects.raw(query)[2]
+ self.assertEqual(third_author.first_name, 'Bob')
+
+ first_two = Author.objects.raw(query)[0:2]
+ self.assertEquals(len(first_two), 2)
+
+ try:
+ Author.objects.raw(query)['test']
+ self.fail('Index lookups should only accept int, long or slice')
+ except TypeError:
+ pass