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:
             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):
         self._fetch_all()
         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
     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
 ------------------------------------
 

+ 8 - 0
tests/raw_query/tests.py

@@ -330,3 +330,11 @@ class RawQueryTests(TestCase):
             books = Book.objects.raw('SELECT * FROM raw_query_book')
             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)