Fixed #29337 -- Added __len__() & __bool__() to RawQuerySet.

This commit is contained in:
Adnan Umer 2018-04-19 15:09:54 +05:00 committed by Tim Graham
parent ec0319ff82
commit f2026ca5e2
3 changed files with 16 additions and 8 deletions

View File

@ -1293,6 +1293,14 @@ class RawQuerySet:
if self._result_cache is None: if self._result_cache is None:
self._result_cache = list(self.iterator()) self._result_cache = list(self.iterator())
def __len__(self):
self._fetch_all()
return len(self._result_cache)
def __bool__(self):
self._fetch_all()
return bool(self._result_cache)
def __iter__(self): def __iter__(self):
self._fetch_all() self._fetch_all()
return iter(self._result_cache) return iter(self._result_cache)

View File

@ -85,14 +85,6 @@ options that make it very powerful.
both rows will match. To prevent this, perform the correct typecasting both rows will match. To prevent this, perform the correct typecasting
before using the value in a query. before using the value in a query.
.. warning::
While a ``RawQuerySet`` instance can be iterated over like a normal
:class:`~django.db.models.query.QuerySet`, ``RawQuerySet`` doesn't
implement all methods you can use with ``QuerySet``. For example,
``__bool__()`` and ``__len__()`` are not defined in ``RawQuerySet``, and
thus all ``RawQuerySet`` instances are considered ``True``.
Mapping query fields to model fields Mapping query fields to model fields
------------------------------------ ------------------------------------

View File

@ -330,3 +330,11 @@ class RawQueryTests(TestCase):
books = Book.objects.raw('SELECT * FROM raw_query_book') books = Book.objects.raw('SELECT * FROM raw_query_book')
list(books.iterator()) list(books.iterator())
list(books.iterator()) list(books.iterator())
def test_bool(self):
self.assertIs(bool(Book.objects.raw('SELECT * FROM raw_query_book')), True)
self.assertIs(bool(Book.objects.raw('SELECT * FROM raw_query_book WHERE id = 0')), False)
def test_len(self):
self.assertEqual(len(Book.objects.raw('SELECT * FROM raw_query_book')), 4)
self.assertEqual(len(Book.objects.raw('SELECT * FROM raw_query_book WHERE id = 0')), 0)