Tests aggregation DurationField

Classe Publisher

1 class Publisher(models.Model):
2     name = models.CharField(max_length=255)
3     num_awards = models.IntegerField()
4     duration = models.DurationField(blank=True, null=True)
5
6     def __str__(self):
7         return self.name

class AggregateTestCase(TestCase)

 1 import datetime
 2 import re
 3 from decimal import Decimal
 4
 5 from django.core.exceptions import FieldError
 6 from django.db import connection
 7 from django.db.models import (
 8     Avg, Case, Count, DecimalField, DurationField, Exists, F, FloatField, Func,
 9     IntegerField, Max, Min, OuterRef, Subquery, Sum, Value, When,
10 )
11 from django.db.models.functions import Coalesce
12 from django.test import TestCase
13 from django.test.testcases import skipUnlessDBFeature
14 from django.test.utils import Approximate, CaptureQueriesContext
15 from django.utils import timezone
16
17 from .models import Author, Book, Publisher, Store
18
19
20 class AggregateTestCase(TestCase):
21
22     @classmethod
23     def setUpTestData(cls):
24         cls.a1 = Author.objects.create(name='Adrian Holovaty', age=34)
25         cls.a2 = Author.objects.create(name='Jacob Kaplan-Moss', age=35)
26         cls.a3 = Author.objects.create(name='Brad Dayley', age=45)
27         cls.a4 = Author.objects.create(name='James Bennett', age=29)
28         cls.a5 = Author.objects.create(name='Jeffrey Forcier', age=37)
29         cls.a6 = Author.objects.create(name='Paul Bissex', age=29)
30         cls.a7 = Author.objects.create(name='Wesley J. Chun', age=25)
31         cls.a8 = Author.objects.create(name='Peter Norvig', age=57)
32         cls.a9 = Author.objects.create(name='Stuart Russell', age=46)
33         cls.a1.friends.add(cls.a2, cls.a4)
34         cls.a2.friends.add(cls.a1, cls.a7)
35         cls.a4.friends.add(cls.a1)
36         cls.a5.friends.add(cls.a6, cls.a7)
37         cls.a6.friends.add(cls.a5, cls.a7)
38         cls.a7.friends.add(cls.a2, cls.a5, cls.a6)
39         cls.a8.friends.add(cls.a9)
40         cls.a9.friends.add(cls.a8)
41
42         cls.p1 = Publisher.objects.create(name='Apress', num_awards=3, duration=datetime.timedelta(days=1))
43         cls.p2 = Publisher.objects.create(name='Sams', num_awards=1, duration=datetime.timedelta(days=2))
44         cls.p3 = Publisher.objects.create(name='Prentice Hall', num_awards=7)
45         cls.p4 = Publisher.objects.create(name='Morgan Kaufmann', num_awards=9)
46         cls.p5 = Publisher.objects.create(name="Jonno's House of Books", num_awards=0)

test_avg_duration_field

 1 def test_avg_duration_field(self):
 2     # Explicit `output_field`.
 3     self.assertEqual(
 4         Publisher.objects.aggregate(Avg('duration', output_field=DurationField())),
 5         {'duration__avg': datetime.timedelta(days=1, hours=12)}
 6     )
 7     # Implicit `output_field`.
 8     self.assertEqual(
 9         Publisher.objects.aggregate(Avg('duration')),
10         {'duration__avg': datetime.timedelta(days=1, hours=12)}
11     )

test_sum_duration_field

1 def test_sum_duration_field(self):
2     self.assertEqual(
3         Publisher.objects.aggregate(Sum('duration', output_field=DurationField())),
4         {'duration__sum': datetime.timedelta(days=3)}
5     )