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:36:55 +1100 |
| commit | 02a2943e4cf95dea0294e8695cfe981f34ae6180 (patch) | |
| tree | da87f399010a9c58b013a869af0ba5ba4e14879e /tests/annotations | |
| parent | 127b3873d03704f77428b984de022664b268314e (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 | 23 |
2 files changed, 30 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 45da5e49de..1230d5c52a 100644 --- a/tests/annotations/tests.py +++ b/tests/annotations/tests.py @@ -5,13 +5,14 @@ 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, Publisher, Store, + Author, Book, Company, DepartmentStore, Employee, Publisher, Store, Ticket, ) @@ -135,6 +136,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()), |
