Kaydet (Commit) 6d4efa8e authored tarafından Nick Pope's avatar Nick Pope Kaydeden (comit) Tim Graham

Refs #28643 -- Changed Variance() to use NumericOutputFieldMixin.

Keeps precision instead of forcing DecimalField to FloatField.
üst e85afa59
......@@ -3,7 +3,7 @@ Classes to represent the definitions of aggregate functions.
"""
from django.core.exceptions import FieldError
from django.db.models.expressions import Case, Func, Star, When
from django.db.models.fields import FloatField, IntegerField
from django.db.models.fields import IntegerField
from django.db.models.functions.mixins import NumericOutputFieldMixin
__all__ = [
......@@ -172,9 +172,8 @@ class Sum(Aggregate):
return super().as_sql(compiler, connection, **extra_context)
class Variance(Aggregate):
class Variance(NumericOutputFieldMixin, Aggregate):
name = 'Variance'
output_field = FloatField()
def __init__(self, expression, sample=False, **extra):
self.function = 'VAR_SAMP' if sample else 'VAR_POP'
......
......@@ -3419,12 +3419,13 @@ by the aggregate.
``Variance``
~~~~~~~~~~~~
.. class:: Variance(expression, sample=False, filter=None, **extra)
.. class:: Variance(expression, output_field=None, sample=False, filter=None, **extra)
Returns the variance of the data in the provided expression.
* Default alias: ``<field>__variance``
* Return type: ``float``
* Return type: ``float`` if input is ``int``, otherwise same as input
field, or ``output_field`` if supplied
Has one optional argument:
......
......@@ -493,9 +493,9 @@ Miscellaneous
* :djadmin:`runserver` no longer supports `pyinotify` (replaced by Watchman).
* The :class:`~django.db.models.Avg` and :class:`~django.db.models.StdDev`
aggregate functions now return a ``Decimal`` instead of a ``float`` when the
input is ``Decimal``.
* The :class:`~django.db.models.Avg`, :class:`~django.db.models.StdDev`, and
:class:`~django.db.models.Variance` aggregate functions now return a
``Decimal`` instead of a ``float`` when the input is ``Decimal``.
.. _deprecated-features-2.2:
......
......@@ -1160,7 +1160,7 @@ class AggregationTests(TestCase):
self.assertEqual(
Book.objects.aggregate(Variance('price')),
{'price__variance': Approximate(583.77, 1)}
{'price__variance': Approximate(Decimal('583.77'), 1)}
)
self.assertEqual(
......@@ -1175,7 +1175,7 @@ class AggregationTests(TestCase):
self.assertEqual(
Book.objects.aggregate(Variance('price', sample=True)),
{'price__variance': Approximate(700.53, 2)}
{'price__variance': Approximate(Decimal('700.53'), 2)}
)
def test_filtering_by_annotation_name(self):
......
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