summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Pope <nick@nickpope.me.uk>2021-07-20 16:28:25 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-07-27 10:06:24 +0200
commit845667f2d1eb7063c568764a01fc9ee633ec5817 (patch)
tree0f16bda631f893f9dc9d3df2833e1d21e595f903
parent19b866c254b54d904a942f34d662dfacd9005a77 (diff)
Refs #32948 -- Simplified and optimized Q._combine() and __invert__().
- Removed use of Q.deconstruct() in Q._combine(). - Simplified and optimized Q.__invert__() by taking a shallow copy and swapping the negated attribute only. - Simplified construction in Q._combine(). - Simplified conditions in Q._combine() as Q.conditional = True the first isinstance() check is unnecessary. - Removed copy.copy() branch in Q._combine(). Co-authored-by: Keryn Knight <keryn@kerynknight.com>
-rw-r--r--django/db/models/query_utils.py17
1 files changed, 6 insertions, 11 deletions
diff --git a/django/db/models/query_utils.py b/django/db/models/query_utils.py
index 9b5824f89f..d566cc1883 100644
--- a/django/db/models/query_utils.py
+++ b/django/db/models/query_utils.py
@@ -5,7 +5,6 @@ Factored out from django.db.models.query to avoid making the main module very
large and/or so that they can be used by other modules without getting into
circular import difficulties.
"""
-import copy
import functools
import inspect
import logging
@@ -54,17 +53,14 @@ class Q(tree.Node):
)
def _combine(self, other, conn):
- if not (isinstance(other, Q) or getattr(other, "conditional", False) is True):
+ if getattr(other, "conditional", False) is False:
raise TypeError(other)
-
if not self:
- return other.copy() if hasattr(other, "copy") else copy.copy(other)
- elif isinstance(other, Q) and not other:
- _, args, kwargs = self.deconstruct()
- return type(self)(*args, **kwargs)
+ return other.copy()
+ if not other and isinstance(other, Q):
+ return self.copy()
- obj = type(self)()
- obj.connector = conn
+ obj = self.create(connector=conn)
obj.add(self, conn)
obj.add(other, conn)
return obj
@@ -79,8 +75,7 @@ class Q(tree.Node):
return self._combine(other, self.XOR)
def __invert__(self):
- obj = type(self)()
- obj.add(self, self.AND)
+ obj = self.copy()
obj.negate()
return obj