diff options
author | Ömer Faruk Abacı <omerfabaci@gmail.com> | 2021-11-30 16:50:13 +0300 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-12-08 21:16:24 +0100 |
commit | 81739a45b5ae8f534910aaabc7e9b457eaa34163 (patch) | |
tree | 3b0f260fabf48232ff8a8bc5e0a814f460e59e48 /tests/queries | |
parent | f04b44bad40369ec2df74b16adb4d3f09350e4b2 (diff) | |
download | django-81739a45b5ae8f534910aaabc7e9b457eaa34163.tar.gz |
Fixed #33319 -- Fixed crash when combining with the | operator querysets with aliases that conflict.
Diffstat (limited to 'tests/queries')
-rw-r--r-- | tests/queries/models.py | 3 | ||||
-rw-r--r-- | tests/queries/tests.py | 22 |
2 files changed, 23 insertions, 2 deletions
diff --git a/tests/queries/models.py b/tests/queries/models.py index c3322c224e..8e7ee1625c 100644 --- a/tests/queries/models.py +++ b/tests/queries/models.py @@ -613,13 +613,14 @@ class OrderItem(models.Model): class BaseUser(models.Model): - pass + annotation = models.ForeignKey(Annotation, models.CASCADE, null=True, blank=True) class Task(models.Model): title = models.CharField(max_length=10) owner = models.ForeignKey(BaseUser, models.CASCADE, related_name='owner') creator = models.ForeignKey(BaseUser, models.CASCADE, related_name='creator') + note = models.ForeignKey(Note, on_delete=models.CASCADE, null=True, blank=True) def __str__(self): return self.title diff --git a/tests/queries/tests.py b/tests/queries/tests.py index ca982b9c6a..f146bc89fd 100644 --- a/tests/queries/tests.py +++ b/tests/queries/tests.py @@ -15,7 +15,7 @@ from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature from django.test.utils import CaptureQueriesContext from .models import ( - FK1, Annotation, Article, Author, BaseA, Book, CategoryItem, + FK1, Annotation, Article, Author, BaseA, BaseUser, Book, CategoryItem, CategoryRelationship, Celebrity, Channel, Chapter, Child, ChildObjectA, Classroom, CommonMixedCaseForeignKeys, Company, Cover, CustomPk, CustomPkTag, DateTimePK, Detail, DumbCategory, Eaten, Employment, @@ -2094,6 +2094,15 @@ class QuerySetBitwiseOperationTests(TestCase): cls.room_2 = Classroom.objects.create(school=cls.school, has_blackboard=True, name='Room 2') cls.room_3 = Classroom.objects.create(school=cls.school, has_blackboard=True, name='Room 3') cls.room_4 = Classroom.objects.create(school=cls.school, has_blackboard=False, name='Room 4') + tag = Tag.objects.create() + cls.annotation_1 = Annotation.objects.create(tag=tag) + annotation_2 = Annotation.objects.create(tag=tag) + note = cls.annotation_1.notes.create(tag=tag) + cls.base_user_1 = BaseUser.objects.create(annotation=cls.annotation_1) + cls.base_user_2 = BaseUser.objects.create(annotation=annotation_2) + cls.task = Task.objects.create( + owner=cls.base_user_2, creator=cls.base_user_2, note=note, + ) @skipUnlessDBFeature('allow_sliced_subqueries_with_in') def test_or_with_rhs_slice(self): @@ -2130,6 +2139,17 @@ class QuerySetBitwiseOperationTests(TestCase): nested_combined = School.objects.filter(pk__in=combined.values('pk')) self.assertSequenceEqual(nested_combined, [self.school]) + def test_conflicting_aliases_during_combine(self): + qs1 = self.annotation_1.baseuser_set.all() + qs2 = BaseUser.objects.filter( + Q(owner__note__in=self.annotation_1.notes.all()) | + Q(creator__note__in=self.annotation_1.notes.all()) + ) + self.assertSequenceEqual(qs1, [self.base_user_1]) + self.assertSequenceEqual(qs2, [self.base_user_2]) + self.assertCountEqual(qs2 | qs1, qs1 | qs2) + self.assertCountEqual(qs2 | qs1, [self.base_user_1, self.base_user_2]) + class CloneTests(TestCase): |