Added a test for updating an annotated queryset.

This commit is contained in:
David Sanders 2016-06-29 12:17:40 -04:00 committed by Tim Graham
parent 18571aefe6
commit 06acb3445f
1 changed files with 20 additions and 0 deletions

View File

@ -1,5 +1,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.core.exceptions import FieldError
from django.db.models import F, Max
from django.test import TestCase from django.test import TestCase
from .models import A, B, Bar, D, DataPoint, Foo, RelatedPoint from .models import A, B, Bar, D, DataPoint, Foo, RelatedPoint
@ -138,3 +140,21 @@ class AdvancedTests(TestCase):
self.assertEqual(bar_qs[0].foo_id, a_foo.target) self.assertEqual(bar_qs[0].foo_id, a_foo.target)
bar_qs.update(foo=b_foo) bar_qs.update(foo=b_foo)
self.assertEqual(bar_qs[0].foo_id, b_foo.target) self.assertEqual(bar_qs[0].foo_id, b_foo.target)
def test_update_annotated_queryset(self):
"""
Update of a queryset that's been annotated.
"""
# Trivial annotated update
qs = DataPoint.objects.annotate(alias=F('value'))
self.assertEqual(qs.update(another_value='foo'), 3)
# Update where annotation is used for filtering
qs = DataPoint.objects.annotate(alias=F('value')).filter(alias='apple')
self.assertEqual(qs.update(another_value='foo'), 1)
# Update where annotation is used in update parameters
qs = DataPoint.objects.annotate(alias=F('value'))
self.assertEqual(qs.update(another_value=F('alias')), 3)
# Update where aggregation annotation is used in update parameters
qs = DataPoint.objects.annotate(max=Max('value'))
with self.assertRaisesMessage(FieldError, 'Aggregate functions are not allowed in this query'):
qs.update(another_value=F('max'))