Fixed #10461 -- bug in generic relation + annotate() case
This issue was fixed when the contenttype restriction was moved from where clause to the join clause. So, this is tests only addition.
This commit is contained in:
parent
8a0489221e
commit
76da053641
|
@ -1,4 +1,4 @@
|
||||||
from django.db.models import Q
|
from django.db.models import Q, Sum
|
||||||
from django.db.utils import IntegrityError
|
from django.db.utils import IntegrityError
|
||||||
from django.test import TestCase, skipIfDBFeature
|
from django.test import TestCase, skipIfDBFeature
|
||||||
|
|
||||||
|
@ -213,3 +213,26 @@ class GenericRelationTests(TestCase):
|
||||||
# B would then fail).
|
# B would then fail).
|
||||||
self.assertNotIn(" join ", str(B.objects.exclude(a__flag=True).query).lower())
|
self.assertNotIn(" join ", str(B.objects.exclude(a__flag=True).query).lower())
|
||||||
self.assertIn("content_type_id", str(B.objects.exclude(a__flag=True).query).lower())
|
self.assertIn("content_type_id", str(B.objects.exclude(a__flag=True).query).lower())
|
||||||
|
|
||||||
|
def test_annotate(self):
|
||||||
|
hs1 = HasLinkThing.objects.create()
|
||||||
|
b = Board.objects.create(name=str(hs1.pk))
|
||||||
|
l = Link.objects.create(content_object=hs1)
|
||||||
|
Link.objects.create(content_object=b)
|
||||||
|
qs = HasLinkThing.objects.annotate(Sum('links'))
|
||||||
|
# If content_type restriction isn't in the query's join condition,
|
||||||
|
# then wrong results are produced here as b will also match (it has
|
||||||
|
# same pk).
|
||||||
|
self.assertEqual(qs.count(), 1)
|
||||||
|
self.assertEqual(qs[0].links__sum, 1)
|
||||||
|
l.delete()
|
||||||
|
# Now if we don't have proper left join, we will not produce any
|
||||||
|
# results at all here.
|
||||||
|
# clear cached results
|
||||||
|
qs = qs.all()
|
||||||
|
self.assertEqual(qs.count(), 1)
|
||||||
|
# Note - 0 here would be a nicer result...
|
||||||
|
self.assertIs(qs[0].links__sum, None)
|
||||||
|
# Finally test that filtering works.
|
||||||
|
self.assertEqual(qs.filter(links__sum__isnull=True).count(), 1)
|
||||||
|
self.assertEqual(qs.filter(links__sum__isnull=False).count(), 0)
|
||||||
|
|
Loading…
Reference in New Issue