Forráskód Böngészése

Fixed #29838 -- Fixed crash when combining Q objects with __in lookups and lists.

Regression in fc6528b25ab1834be1a478b405bf8f7ec5cf860c.
aspalding 6 éve
szülő
commit
dc5e75d419
3 módosított fájl, 9 hozzáadás és 6 törlés
  1. 3 4
      django/utils/tree.py
  2. 3 2
      docs/releases/2.1.3.txt
  3. 3 0
      tests/utils_tests/test_tree.py

+ 3 - 4
django/utils/tree.py

@@ -5,6 +5,8 @@ ORM.
 
 import copy
 
+from django.utils.hashable import make_hashable
+
 
 class Node:
     """
@@ -71,10 +73,7 @@ class Node:
         )
 
     def __hash__(self):
-        return hash((self.__class__, self.connector, self.negated, *[
-            tuple(child) if isinstance(child, list) else child
-            for child in self.children
-        ]))
+        return hash((self.__class__, self.connector, self.negated, *make_hashable(self.children)))
 
     def add(self, data, conn_type, squash=True):
         """

+ 3 - 2
docs/releases/2.1.3.txt

@@ -4,9 +4,10 @@ Django 2.1.3 release notes
 
 *Expected November 1, 2018*
 
-Django 2.1.3 fixes several bugs in 2.1.2
+Django 2.1.3 fixes several bugs in 2.1.2.
 
 Bugfixes
 ========
 
-* ...
+* Fixed a regression in Django 2.0 where combining ``Q`` objects with ``__in``
+  lookups and lists crashed (:ticket:`29838`).

+ 3 - 0
tests/utils_tests/test_tree.py

@@ -24,12 +24,15 @@ class NodeTests(unittest.TestCase):
         node4 = Node(self.node1_children, connector='OTHER')
         node5 = Node(self.node1_children)
         node6 = Node([['a', 1], ['b', 2]])
+        node7 = Node([('a', [1, 2])])
+        node8 = Node([('a', (1, 2))])
         self.assertNotEqual(hash(self.node1), hash(self.node2))
         self.assertNotEqual(hash(self.node1), hash(node3))
         self.assertNotEqual(hash(self.node1), hash(node4))
         self.assertEqual(hash(self.node1), hash(node5))
         self.assertEqual(hash(self.node1), hash(node6))
         self.assertEqual(hash(self.node2), hash(Node()))
+        self.assertEqual(hash(node7), hash(node8))
 
     def test_len(self):
         self.assertEqual(len(self.node1), 2)