mirror of
https://github.com/django/django.git
synced 2025-08-09 21:38:18 +00:00
[1.8.x] Fixed #24766 -- Added join promotion for Case expressions
Backport of be9d645346
from master
This commit is contained in:
parent
d3a8f36fdb
commit
056a91dbfa
3 changed files with 42 additions and 1 deletions
|
@ -1031,6 +1031,38 @@ class CaseExpressionTests(TestCase):
|
|||
transform=attrgetter('integer', 'test')
|
||||
)
|
||||
|
||||
def test_join_promotion(self):
|
||||
o = CaseTestModel.objects.create(integer=1, integer2=1, string='1')
|
||||
# Testing that:
|
||||
# 1. There isn't any object on the remote side of the fk_rel
|
||||
# relation. If the query used inner joins, then the join to fk_rel
|
||||
# would remove o from the results. So, in effect we are testing that
|
||||
# we are promoting the fk_rel join to a left outer join here.
|
||||
# 2. The default value of 3 is generated for the case expression.
|
||||
self.assertQuerysetEqual(
|
||||
CaseTestModel.objects.filter(pk=o.pk).annotate(
|
||||
foo=Case(
|
||||
When(fk_rel__pk=1, then=2),
|
||||
default=3,
|
||||
output_field=models.IntegerField()
|
||||
),
|
||||
),
|
||||
[(o, 3)],
|
||||
lambda x: (x, x.foo)
|
||||
)
|
||||
# Now 2 should be generated, as the fk_rel is null.
|
||||
self.assertQuerysetEqual(
|
||||
CaseTestModel.objects.filter(pk=o.pk).annotate(
|
||||
foo=Case(
|
||||
When(fk_rel__isnull=True, then=2),
|
||||
default=3,
|
||||
output_field=models.IntegerField()
|
||||
),
|
||||
),
|
||||
[(o, 2)],
|
||||
lambda x: (x, x.foo)
|
||||
)
|
||||
|
||||
|
||||
class CaseDocumentationExamples(TestCase):
|
||||
@classmethod
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue