diff options
| author | Josh Smeaton <josh.smeaton@gmail.com> | 2015-03-19 14:07:53 +1100 |
|---|---|---|
| committer | Josh Smeaton <josh.smeaton@gmail.com> | 2015-03-22 17:41:12 +1100 |
| commit | e654123f7fa5b7f04ce5c86bc10689011c8eec69 (patch) | |
| tree | 6a3090c218443e14f9055ea96bd872e30cbc01a5 /tests/annotations | |
| parent | 3a1886d1113a68794fe36aafd771a7e5db703e24 (diff) | |
Fixed #24485 -- Allowed combined expressions to set output_field
Diffstat (limited to 'tests/annotations')
| -rw-r--r-- | tests/annotations/models.py | 9 | ||||
| -rw-r--r-- | tests/annotations/tests.py | 25 |
2 files changed, 32 insertions, 2 deletions
diff --git a/tests/annotations/models.py b/tests/annotations/models.py index 0c438b99f8..954c8ad339 100644 --- a/tests/annotations/models.py +++ b/tests/annotations/models.py @@ -84,3 +84,12 @@ class Company(models.Model): return ('Company(name=%s, motto=%s, ticker_name=%s, description=%s)' % (self.name, self.motto, self.ticker_name, self.description) ) + + +@python_2_unicode_compatible +class Ticket(models.Model): + active_at = models.DateTimeField() + duration = models.DurationField() + + def __str__(self): + return '{} - {}'.format(self.active_at, self.duration) diff --git a/tests/annotations/tests.py b/tests/annotations/tests.py index 55ef30b575..f684f80da6 100644 --- a/tests/annotations/tests.py +++ b/tests/annotations/tests.py @@ -5,12 +5,15 @@ from decimal import Decimal from django.core.exceptions import FieldDoesNotExist, FieldError from django.db.models import ( - F, BooleanField, CharField, Count, Func, IntegerField, Sum, Value, + F, BooleanField, CharField, Count, DateTimeField, ExpressionWrapper, Func, + IntegerField, Sum, Value, ) from django.test import TestCase from django.utils import six -from .models import Author, Book, Company, DepartmentStore, Employee, Store +from .models import ( + Author, Book, Company, DepartmentStore, Employee, Publisher, Store, Ticket, +) def cxOracle_513_py3_bug(func): @@ -52,6 +55,24 @@ class NonAggregateAnnotationTestCase(TestCase): for book in books: self.assertEqual(book.num_awards, book.publisher.num_awards) + def test_mixed_type_annotation_date_interval(self): + active = datetime.datetime(2015, 3, 20, 14, 0, 0) + duration = datetime.timedelta(hours=1) + expires = datetime.datetime(2015, 3, 20, 14, 0, 0) + duration + Ticket.objects.create(active_at=active, duration=duration) + t = Ticket.objects.annotate( + expires=ExpressionWrapper(F('active_at') + F('duration'), output_field=DateTimeField()) + ).first() + self.assertEqual(t.expires, expires) + + def test_mixed_type_annotation_numbers(self): + test = self.b1 + b = Book.objects.annotate( + combined=ExpressionWrapper(F('pages') + F('rating'), output_field=IntegerField()) + ).get(isbn=test.isbn) + combined = int(test.pages + test.rating) + self.assertEqual(b.combined, combined) + def test_annotate_with_aggregation(self): books = Book.objects.annotate( is_book=Value(1, output_field=IntegerField()), |
