Browse Source

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

Adnan Umer 7 years ago
parent
commit
f2026ca5e2
3 changed files with 16 additions and 8 deletions
  1. 8 0
      django/db/models/query.py
  2. 0 8
      docs/topics/db/sql.txt
  3. 8 0
      tests/raw_query/tests.py

+ 8 - 0
django/db/models/query.py

@@ -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)

+ 0 - 8
docs/topics/db/sql.txt

@@ -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
 ------------------------------------
 ------------------------------------
 
 

+ 8 - 0
tests/raw_query/tests.py

@@ -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)