Merge pull request #2204 from Pacu2/2203/ability-to-compare-q-objects

Add __eq__ to Q and Q operations
This commit is contained in:
Bastien Gérard 2019-12-04 20:58:04 +01:00 committed by GitHub
commit 35310dbc73
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 48 additions and 1 deletions

View File

@ -252,3 +252,4 @@ that much better:
* Paulo Amaral (https://github.com/pauloAmaral) * Paulo Amaral (https://github.com/pauloAmaral)
* Gaurav Dadhania (https://github.com/GVRV) * Gaurav Dadhania (https://github.com/GVRV)
* Yurii Andrieiev (https://github.com/yandrieiev) * Yurii Andrieiev (https://github.com/yandrieiev)
* Filip Kucharczyk (https://github.com/Pacu2)

View File

@ -23,6 +23,7 @@ Development
- Switch from nosetest to pytest as test runner #2114 - Switch from nosetest to pytest as test runner #2114
- The codebase is now formatted using ``black``. #2109 - The codebase is now formatted using ``black``. #2109
- In bulk write insert, the detailed error message would raise in exception. - In bulk write insert, the detailed error message would raise in exception.
- Added ability to compare Q and Q operations #2204
Changes in 0.18.2 Changes in 0.18.2
================= =================

View File

@ -96,9 +96,11 @@ class QNode(object):
"""Combine this node with another node into a QCombination """Combine this node with another node into a QCombination
object. object.
""" """
# If the other Q() is empty, ignore it and just use `self`.
if getattr(other, "empty", True): if getattr(other, "empty", True):
return self return self
# Or if this Q is empty, ignore it and just use `other`.
if self.empty: if self.empty:
return other return other
@ -146,6 +148,13 @@ class QCombination(QNode):
def empty(self): def empty(self):
return not bool(self.children) return not bool(self.children)
def __eq__(self, other):
return (
self.__class__ == other.__class__
and self.operation == other.operation
and self.children == other.children
)
class Q(QNode): class Q(QNode):
"""A simple query object, used in a query tree to build up more complex """A simple query object, used in a query tree to build up more complex
@ -164,3 +173,6 @@ class Q(QNode):
@property @property
def empty(self): def empty(self):
return not bool(self.query) return not bool(self.query)
def __eq__(self, other):
return self.__class__ == other.__class__ and self.query == other.query

View File

@ -3644,7 +3644,7 @@ class TestInstance(MongoDBTestCase):
User.objects().select_related() User.objects().select_related()
def test_embedded_document_failed_while_loading_instance_when_it_is_not_a_dict( def test_embedded_document_failed_while_loading_instance_when_it_is_not_a_dict(
self self,
): ):
class LightSaber(EmbeddedDocument): class LightSaber(EmbeddedDocument):
color = StringField() color = StringField()

View File

@ -374,6 +374,39 @@ class TestQ(unittest.TestCase):
== 2 == 2
) )
def test_equality(self):
assert Q(name="John") == Q(name="John")
assert Q() == Q()
def test_inequality(self):
assert Q(name="John") != Q(name="Ralph")
def test_operation_equality(self):
q1 = Q(name="John") | Q(title="Sir") & Q(surname="Paul")
q2 = Q(name="John") | Q(title="Sir") & Q(surname="Paul")
assert q1 == q2
def test_operation_inequality(self):
q1 = Q(name="John") | Q(title="Sir")
q2 = Q(title="Sir") | Q(name="John")
assert q1 != q2
def test_combine_and_empty(self):
q = Q(x=1)
assert q & Q() == q
assert Q() & q == q
def test_combine_and_both_empty(self):
assert Q() & Q() == Q()
def test_combine_or_empty(self):
q = Q(x=1)
assert q | Q() == q
assert Q() | q == q
def test_combine_or_both_empty(self):
assert Q() | Q() == Q()
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()