mirror of
https://github.com/django/django.git
synced 2025-09-26 12:09:19 +00:00
Fixed #29865 -- Added logical XOR support for Q() and querysets.
This commit is contained in:
parent
795da6306a
commit
c6b4d62fa2
19 changed files with 311 additions and 18 deletions
|
@ -1883,6 +1883,10 @@ class Queries5Tests(TestCase):
|
|||
Note.objects.exclude(~Q() & ~Q()),
|
||||
[self.n1, self.n2],
|
||||
)
|
||||
self.assertSequenceEqual(
|
||||
Note.objects.exclude(~Q() ^ ~Q()),
|
||||
[self.n1, self.n2],
|
||||
)
|
||||
|
||||
def test_extra_select_literal_percent_s(self):
|
||||
# Allow %%s to escape select clauses
|
||||
|
@ -2129,6 +2133,15 @@ class Queries6Tests(TestCase):
|
|||
sql = captured_queries[0]["sql"]
|
||||
self.assertIn("AS %s" % connection.ops.quote_name("col1"), sql)
|
||||
|
||||
def test_xor_subquery(self):
|
||||
self.assertSequenceEqual(
|
||||
Tag.objects.filter(
|
||||
Exists(Tag.objects.filter(id=OuterRef("id"), name="t3"))
|
||||
^ Exists(Tag.objects.filter(id=OuterRef("id"), parent=self.t1))
|
||||
),
|
||||
[self.t2],
|
||||
)
|
||||
|
||||
|
||||
class RawQueriesTests(TestCase):
|
||||
@classmethod
|
||||
|
@ -2432,6 +2445,30 @@ class QuerySetBitwiseOperationTests(TestCase):
|
|||
qs2 = Classroom.objects.filter(has_blackboard=True).order_by("-name")[:1]
|
||||
self.assertCountEqual(qs1 | qs2, [self.room_3, self.room_4])
|
||||
|
||||
@skipUnlessDBFeature("allow_sliced_subqueries_with_in")
|
||||
def test_xor_with_rhs_slice(self):
|
||||
qs1 = Classroom.objects.filter(has_blackboard=True)
|
||||
qs2 = Classroom.objects.filter(has_blackboard=False)[:1]
|
||||
self.assertCountEqual(qs1 ^ qs2, [self.room_1, self.room_2, self.room_3])
|
||||
|
||||
@skipUnlessDBFeature("allow_sliced_subqueries_with_in")
|
||||
def test_xor_with_lhs_slice(self):
|
||||
qs1 = Classroom.objects.filter(has_blackboard=True)[:1]
|
||||
qs2 = Classroom.objects.filter(has_blackboard=False)
|
||||
self.assertCountEqual(qs1 ^ qs2, [self.room_1, self.room_2, self.room_4])
|
||||
|
||||
@skipUnlessDBFeature("allow_sliced_subqueries_with_in")
|
||||
def test_xor_with_both_slice(self):
|
||||
qs1 = Classroom.objects.filter(has_blackboard=False)[:1]
|
||||
qs2 = Classroom.objects.filter(has_blackboard=True)[:1]
|
||||
self.assertCountEqual(qs1 ^ qs2, [self.room_1, self.room_2])
|
||||
|
||||
@skipUnlessDBFeature("allow_sliced_subqueries_with_in")
|
||||
def test_xor_with_both_slice_and_ordering(self):
|
||||
qs1 = Classroom.objects.filter(has_blackboard=False).order_by("-pk")[:1]
|
||||
qs2 = Classroom.objects.filter(has_blackboard=True).order_by("-name")[:1]
|
||||
self.assertCountEqual(qs1 ^ qs2, [self.room_3, self.room_4])
|
||||
|
||||
def test_subquery_aliases(self):
|
||||
combined = School.objects.filter(pk__isnull=False) & School.objects.filter(
|
||||
Exists(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue