|
5 | 5 | from django.test import TestCase, skipIfDBFeature, skipUnlessDBFeature
|
6 | 6 | from django.test.utils import CaptureQueriesContext
|
7 | 7 |
|
8 |
| -from .models import Author, Celebrity, ExtraInfo, Number, ReservedName |
| 8 | +from .models import Author, Celebrity, ExtraInfo, Number, Report, ReservedName |
9 | 9 |
|
10 | 10 |
|
11 | 11 | @skipUnlessDBFeature("supports_select_union")
|
@@ -123,6 +123,31 @@ def test_union_nested(self):
|
123 | 123 | ordered=False,
|
124 | 124 | )
|
125 | 125 |
|
| 126 | + def test_union_with_different_models(self): |
| 127 | + expected_result = { |
| 128 | + "Angel", |
| 129 | + "Lionel", |
| 130 | + "Emiliano", |
| 131 | + "Demetrio", |
| 132 | + "Daniel", |
| 133 | + "Javier", |
| 134 | + } |
| 135 | + Celebrity.objects.create(name="Angel") |
| 136 | + Celebrity.objects.create(name="Lionel") |
| 137 | + Celebrity.objects.create(name="Emiliano") |
| 138 | + Celebrity.objects.create(name="Demetrio") |
| 139 | + Report.objects.create(name="Demetrio") |
| 140 | + Report.objects.create(name="Daniel") |
| 141 | + Report.objects.create(name="Javier") |
| 142 | + qs1 = Celebrity.objects.values(alias=F("name")) |
| 143 | + qs2 = Report.objects.values(alias_author=F("name")) |
| 144 | + qs3 = qs1.union(qs2).values("name") |
| 145 | + self.assertCountEqual((e["name"] for e in qs3), expected_result) |
| 146 | + qs4 = qs1.union(qs2) |
| 147 | + self.assertCountEqual((e["alias"] for e in qs4), expected_result) |
| 148 | + qs5 = qs2.union(qs1) |
| 149 | + self.assertCountEqual((e["alias_author"] for e in qs5), expected_result) |
| 150 | + |
126 | 151 | @skipUnlessDBFeature("supports_select_intersection")
|
127 | 152 | def test_intersection_with_empty_qs(self):
|
128 | 153 | qs1 = Number.objects.all()
|
@@ -474,6 +499,16 @@ def test_count_intersection(self):
|
474 | 499 | qs2 = Number.objects.filter(num__lte=5)
|
475 | 500 | self.assertEqual(qs1.intersection(qs2).count(), 1)
|
476 | 501 |
|
| 502 | + @skipUnlessDBFeature("supports_slicing_ordering_in_compound") |
| 503 | + def test_count_union_with_select_related_projected(self): |
| 504 | + e1 = ExtraInfo.objects.create(value=1, info="e1") |
| 505 | + a1 = Author.objects.create(name="a1", num=1, extra=e1) |
| 506 | + qs = Author.objects.select_related("extra").values("pk", "name", "extra__value") |
| 507 | + self.assertEqual(len(qs.union(qs)), 1) |
| 508 | + self.assertEqual( |
| 509 | + qs.union(qs).first(), {"pk": a1.id, "name": "a1", "extra__value": 1} |
| 510 | + ) |
| 511 | + |
477 | 512 | def test_exists_union(self):
|
478 | 513 | qs1 = Number.objects.filter(num__gte=5)
|
479 | 514 | qs2 = Number.objects.filter(num__lte=5)
|
|
0 commit comments