mirror of
https://github.com/django/django.git
synced 2025-10-24 14:16:09 +00:00
Fixed #21376 -- New implementation for query join promotion logic
This commit introduced a new class JoinPromoter that can be used to abstract away join promotion problems for complex filter conditions. Query._add_q() and Query.combine() now use the new class. Also, added a lot of comments about why join promotion is done the way it is. Thanks to Tim Graham for original report and testing the changes, and for Loic Bistuer for review.
This commit is contained in:
@@ -3189,3 +3189,16 @@ class ValuesJoinPromotionTests(TestCase):
|
||||
def test_non_nullable_fk_not_promoted(self):
|
||||
qs = ObjectB.objects.values('objecta__name')
|
||||
self.assertTrue(' INNER JOIN ' in str(qs.query))
|
||||
|
||||
def test_ticket_21376(self):
|
||||
a = ObjectA.objects.create()
|
||||
ObjectC.objects.create(objecta=a)
|
||||
qs = ObjectC.objects.filter(
|
||||
Q(objecta=a) | Q(objectb__objecta=a),
|
||||
)
|
||||
qs = qs.filter(
|
||||
Q(objectb=1) | Q(objecta=a),
|
||||
)
|
||||
self.assertEqual(qs.count(), 1)
|
||||
tblname = connection.ops.quote_name(ObjectB._meta.db_table)
|
||||
self.assertTrue(' LEFT OUTER JOIN %s' % tblname in str(qs.query))
|
||||
|
||||
Reference in New Issue
Block a user