Kaydet (Commit) 06acb344 authored tarafından David Sanders's avatar David Sanders Kaydeden (comit) Tim Graham

Added a test for updating an annotated queryset.

üst 18571aef
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): ...@@ -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'))
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment