Browse Source

Fixed #26390 -- Disabled grouping by Random().

Thanks to Tzu-ping Chung for the tests.
Étienne Beaulé 4 years ago
parent
commit
509d9da26f
3 changed files with 19 additions and 0 deletions
  1. 1 0
      AUTHORS
  2. 3 0
      django/db/models/functions/math.py
  3. 15 0
      tests/aggregation/tests.py

+ 1 - 0
AUTHORS

@@ -293,6 +293,7 @@ answer newbie questions, and generally made Django that much better:
     Erwin Junge <erwin@junge.nl>
     Esdras Beleza <linux@esdrasbeleza.com>
     Espen Grindhaug <http://grindhaug.org/>
+    Étienne Beaulé <beauleetienne0@gmail.com>
     Eugene Lazutkin <http://lazutkin.com/blog/>
     Evan Grim <https://github.com/egrim>
     Fabrice Aneche <akh@nobugware.com>

+ 3 - 0
django/db/models/functions/math.py

@@ -154,6 +154,9 @@ class Random(NumericOutputFieldMixin, Func):
     def as_sqlite(self, compiler, connection, **extra_context):
         return super().as_sql(compiler, connection, function='RAND', **extra_context)
 
+    def get_group_by_cols(self, alias=None):
+        return []
+
 
 class Round(Transform):
     function = 'ROUND'

+ 15 - 0
tests/aggregation/tests.py

@@ -1315,3 +1315,18 @@ class AggregateTestCase(TestCase):
         # with self.assertNumQueries(1) as ctx:
         #     self.assertSequenceEqual(books_qs, [book])
         # self.assertEqual(ctx[0]['sql'].count('SELECT'), 2)
+
+    def test_aggregation_random_ordering(self):
+        """Random() is not included in the GROUP BY when used for ordering."""
+        authors = Author.objects.annotate(contact_count=Count('book')).order_by('?')
+        self.assertQuerysetEqual(authors, [
+            ('Adrian Holovaty', 1),
+            ('Jacob Kaplan-Moss', 1),
+            ('Brad Dayley', 1),
+            ('James Bennett', 1),
+            ('Jeffrey Forcier', 1),
+            ('Paul Bissex', 1),
+            ('Wesley J. Chun', 1),
+            ('Stuart Russell', 1),
+            ('Peter Norvig', 2),
+        ], lambda a: (a.name, a.contact_count), ordered=False)