summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2018-02-12 14:20:54 -0500
committerTim Graham <timograham@gmail.com>2018-02-12 20:47:58 -0500
commitfd18345e10b9e5c9713c606509feaf18e57178e2 (patch)
tree59319e855588ccadf6f8f52853d97bbadd3be94b
parentaeb35548dc3a669aebec45f8f51a9cd3fbfc8801 (diff)
[2.0.x] Refs #29125 -- Made Q.deconstruct() omit 'query_utils' in the path and _connector='AND' since it's a default value.
Backport of 9ba3df82402e7e23b353da20aea6894935241ef9 from master
-rw-r--r--django/db/models/query_utils.py5
-rw-r--r--tests/queries/test_q.py12
2 files changed, 8 insertions, 9 deletions
diff --git a/django/db/models/query_utils.py b/django/db/models/query_utils.py
index 1ecc5e38c8..74f9946c9d 100644
--- a/django/db/models/query_utils.py
+++ b/django/db/models/query_utils.py
@@ -97,13 +97,16 @@ class Q(tree.Node):
def deconstruct(self):
path = '%s.%s' % (self.__class__.__module__, self.__class__.__name__)
+ if path.startswith('django.db.models.query_utils'):
+ path = path.replace('django.db.models.query_utils', 'django.db.models')
args, kwargs = (), {}
if len(self.children) == 1 and not isinstance(self.children[0], Q):
child = self.children[0]
kwargs = {child[0]: child[1]}
else:
args = tuple(self.children)
- kwargs = {'_connector': self.connector}
+ if self.connector != self.default:
+ kwargs = {'_connector': self.connector}
if self.negated:
kwargs['_negated'] = True
return path, args, kwargs
diff --git a/tests/queries/test_q.py b/tests/queries/test_q.py
index 2ed4278b77..9e71553ef7 100644
--- a/tests/queries/test_q.py
+++ b/tests/queries/test_q.py
@@ -22,14 +22,13 @@ class QTests(SimpleTestCase):
def test_deconstruct(self):
q = Q(price__gt=F('discounted_price'))
path, args, kwargs = q.deconstruct()
- self.assertEqual(path, 'django.db.models.query_utils.Q')
+ self.assertEqual(path, 'django.db.models.Q')
self.assertEqual(args, ())
self.assertEqual(kwargs, {'price__gt': F('discounted_price')})
def test_deconstruct_negated(self):
q = ~Q(price__gt=F('discounted_price'))
path, args, kwargs = q.deconstruct()
- self.assertEqual(path, 'django.db.models.query_utils.Q')
self.assertEqual(args, ())
self.assertEqual(kwargs, {
'price__gt': F('discounted_price'),
@@ -41,7 +40,6 @@ class QTests(SimpleTestCase):
q2 = Q(price=F('discounted_price'))
q = q1 | q2
path, args, kwargs = q.deconstruct()
- self.assertEqual(path, 'django.db.models.query_utils.Q')
self.assertEqual(args, (
('price__gt', F('discounted_price')),
('price', F('discounted_price')),
@@ -53,12 +51,11 @@ class QTests(SimpleTestCase):
q2 = Q(price=F('discounted_price'))
q = q1 & q2
path, args, kwargs = q.deconstruct()
- self.assertEqual(path, 'django.db.models.query_utils.Q')
self.assertEqual(args, (
('price__gt', F('discounted_price')),
('price', F('discounted_price')),
))
- self.assertEqual(kwargs, {'_connector': 'AND'})
+ self.assertEqual(kwargs, {})
def test_deconstruct_multiple_kwargs(self):
q = Q(price__gt=F('discounted_price'), price=F('discounted_price'))
@@ -67,14 +64,13 @@ class QTests(SimpleTestCase):
('price', F('discounted_price')),
('price__gt', F('discounted_price')),
))
- self.assertEqual(kwargs, {'_connector': 'AND'})
+ self.assertEqual(kwargs, {})
def test_deconstruct_nested(self):
q = Q(Q(price__gt=F('discounted_price')))
path, args, kwargs = q.deconstruct()
- self.assertEqual(path, 'django.db.models.query_utils.Q')
self.assertEqual(args, (Q(price__gt=F('discounted_price')),))
- self.assertEqual(kwargs, {'_connector': 'AND'})
+ self.assertEqual(kwargs, {})
def test_reconstruct(self):
q = Q(price__gt=F('discounted_price'))