示例#1
0
    def test_order_of_precedence(self):
        p1 = Book.objects.filter(rating=4).aggregate(
            avg_price=(Avg('price') + 2) * 3)
        self.assertEqual(p1, {'avg_price': Approximate(148.18, places=2)})

        p2 = Book.objects.filter(rating=4).aggregate(avg_price=Avg('price') +
                                                     2 * 3)
        self.assertEqual(p2, {'avg_price': Approximate(53.39, places=2)})
示例#2
0
 def test_float_serialization(self):
     """Float values serialize and deserialize intact"""
     sc = Score(score=3.4)
     sc.save()
     serial_str = serializers.serialize(self.serializer_name, [sc])
     deserial_objs = list(serializers.deserialize(self.serializer_name, serial_str))
     self.assertEqual(deserial_objs[0].object.score, Approximate(3.4, places=1))
示例#3
0
 def test_aggregation_expressions(self):
     a1 = Author.objects.aggregate(av_age=Sum('age') / Count('*'))
     a2 = Author.objects.aggregate(av_age=Sum('age') / Count('age'))
     a3 = Author.objects.aggregate(av_age=Avg('age'))
     self.assertEqual(a1, {'av_age': 37})
     self.assertEqual(a2, {'av_age': 37})
     self.assertEqual(a3, {'av_age': Approximate(37.4, places=1)})
示例#4
0
    def test_related_aggregate(self):
        vals = Author.objects.aggregate(Avg("friends__age"))
        self.assertEqual(vals,
                         {'friends__age__avg': Approximate(34.07, places=2)})

        vals = Book.objects.filter(rating__lt=4.5).aggregate(
            Avg("authors__age"))
        self.assertEqual(vals,
                         {'authors__age__avg': Approximate(38.2857, places=2)})

        vals = Author.objects.all().filter(name__contains="a").aggregate(
            Avg("book__rating"))
        self.assertEqual(vals, {'book__rating__avg': 4.0})

        vals = Book.objects.aggregate(Sum("publisher__num_awards"))
        self.assertEqual(vals, {'publisher__num_awards__sum': 30})

        vals = Publisher.objects.aggregate(Sum("book__price"))
        self.assertEqual(vals, {'book__price__sum': Decimal('270.27')})
示例#5
0
    def test_combine_different_types(self):
        msg = 'Expression contains mixed types. You must set output_field.'
        qs = Book.objects.annotate(sums=Sum('rating') + Sum('pages') +
                                   Sum('price'))
        with self.assertRaisesMessage(FieldError, msg):
            qs.first()
        with self.assertRaisesMessage(FieldError, msg):
            qs.first()

        b1 = Book.objects.annotate(sums=Sum(
            F('rating') + F('pages') +
            F('price'), output_field=IntegerField())).get(pk=self.b4.pk)
        self.assertEqual(b1.sums, 383)

        b2 = Book.objects.annotate(sums=Sum(
            F('rating') + F('pages') +
            F('price'), output_field=FloatField())).get(pk=self.b4.pk)
        self.assertEqual(b2.sums, 383.69)

        b3 = Book.objects.annotate(sums=Sum(
            F('rating') + F('pages') +
            F('price'), output_field=DecimalField())).get(pk=self.b4.pk)
        self.assertEqual(b3.sums, Approximate(Decimal("383.69"), places=2))
示例#6
0
    def test_annotate_m2m(self):
        books = Book.objects.filter(rating__lt=4.5).annotate(
            Avg("authors__age")).order_by("name")
        self.assertQuerysetEqual(
            books,
            [('Artificial Intelligence: A Modern Approach', 51.5),
             ('Practical Django Projects', 29.0),
             ('Python Web Development with Django', Approximate(30.3,
                                                                places=1)),
             ('Sams Teach Yourself Django in 24 Hours', 45.0)],
            lambda b: (b.name, b.authors__age__avg),
        )

        books = Book.objects.annotate(
            num_authors=Count("authors")).order_by("name")
        self.assertQuerysetEqual(books, [
            ('Artificial Intelligence: A Modern Approach', 2),
            ('Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp',
             1), ('Practical Django Projects', 1),
            ('Python Web Development with Django', 3),
            ('Sams Teach Yourself Django in 24 Hours', 1),
            ('The Definitive Guide to Django: Web Development Done Right', 2)
        ], lambda b: (b.name, b.num_authors))
示例#7
0
 def test_avg_decimal_field(self):
     v = Book.objects.filter(rating=4).aggregate(
         avg_price=(Avg('price')))['avg_price']
     self.assertIsInstance(v, float)
     self.assertEqual(v, Approximate(47.39, places=2))
示例#8
0
 def test_aggregate_annotation(self):
     vals = Book.objects.annotate(
         num_authors=Count("authors__id")).aggregate(Avg("num_authors"))
     self.assertEqual(vals,
                      {"num_authors__avg": Approximate(1.66, places=1)})
示例#9
0
    def test_annotate_values(self):
        books = list(
            Book.objects.filter(pk=self.b1.pk).annotate(
                mean_age=Avg("authors__age")).values())
        self.assertEqual(books, [{
            "contact_id": self.a1.id,
            "id": self.b1.id,
            "isbn": "159059725",
            "mean_age": 34.5,
            "name":
            "The Definitive Guide to Django: Web Development Done Right",
            "pages": 447,
            "price": Approximate(Decimal("30")),
            "pubdate": datetime.date(2007, 12, 6),
            "publisher_id": self.p1.id,
            "rating": 4.5,
        }])

        books = (Book.objects.filter(pk=self.b1.pk).annotate(
            mean_age=Avg('authors__age')).values('pk', 'isbn', 'mean_age'))
        self.assertEqual(list(books), [{
            "pk": self.b1.pk,
            "isbn": "159059725",
            "mean_age": 34.5,
        }])

        books = Book.objects.filter(pk=self.b1.pk).annotate(
            mean_age=Avg("authors__age")).values("name")
        self.assertEqual(
            list(books),
            [{
                'name':
                'The Definitive Guide to Django: Web Development Done Right'
            }],
        )

        books = Book.objects.filter(pk=self.b1.pk).values().annotate(
            mean_age=Avg('authors__age'))
        self.assertEqual(list(books), [{
            "contact_id": self.a1.id,
            "id": self.b1.id,
            "isbn": "159059725",
            "mean_age": 34.5,
            "name":
            "The Definitive Guide to Django: Web Development Done Right",
            "pages": 447,
            "price": Approximate(Decimal("30")),
            "pubdate": datetime.date(2007, 12, 6),
            "publisher_id": self.p1.id,
            "rating": 4.5,
        }])

        books = (Book.objects.values("rating").annotate(
            n_authors=Count("authors__id"),
            mean_age=Avg("authors__age")).order_by("rating"))
        self.assertEqual(list(books), [{
            "rating": 3.0,
            "n_authors": 1,
            "mean_age": 45.0,
        }, {
            "rating": 4.0,
            "n_authors": 6,
            "mean_age": Approximate(37.16, places=1)
        }, {
            "rating": 4.5,
            "n_authors": 2,
            "mean_age": 34.5,
        }, {
            "rating": 5.0,
            "n_authors": 1,
            "mean_age": 57.0,
        }])

        authors = Author.objects.annotate(Avg("friends__age")).order_by("name")
        self.assertQuerysetEqual(
            authors, [('Adrian Holovaty', 32.0), ('Brad Dayley', None),
                      ('Jacob Kaplan-Moss', 29.5), ('James Bennett', 34.0),
                      ('Jeffrey Forcier', 27.0), ('Paul Bissex', 31.0),
                      ('Peter Norvig', 46.0), ('Stuart Russell', 57.0),
                      ('Wesley J. Chun', Approximate(33.66, places=1))],
            lambda a: (a.name, a.friends__age__avg))
示例#10
0
 def test_aggregate_alias(self):
     vals = Store.objects.filter(name="Amazon.com").aggregate(
         amazon_mean=Avg("books__rating"))
     self.assertEqual(vals, {'amazon_mean': Approximate(4.08, places=2)})
示例#11
0
 def test_multiple_aggregates(self):
     vals = Author.objects.aggregate(Sum("age"), Avg("age"))
     self.assertEqual(vals, {
         "age__sum": 337,
         "age__avg": Approximate(37.4, places=1)
     })
示例#12
0
 def test_single_aggregate(self):
     vals = Author.objects.aggregate(Avg("age"))
     self.assertEqual(vals, {"age__avg": Approximate(37.4, places=1)})
示例#13
0
 def test_covar_pop_general(self):
     values = StatTestModel.objects.aggregate(
         covarpop=CovarPop(y='int2', x='int1'))
     self.assertEqual(values, {'covarpop': Approximate(-0.66, places=1)})