diff options
author | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2023-01-06 13:53:42 +0100 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2023-01-17 11:49:15 +0100 |
commit | 0be8095b254fad65b2480d677ebe6098c41bbad6 (patch) | |
tree | 0c084fdc30cbcc0e7cb7e76955b20316da137396 /django/contrib/postgres/aggregates/general.py | |
parent | 43b01300b7c7e9d24b549a408010e52a09726060 (diff) | |
download | django-0be8095b254fad65b2480d677ebe6098c41bbad6.tar.gz |
Refs #10929 -- Stopped forcing empty result value by PostgreSQL aggregates.
Per deprecation timeline.
Diffstat (limited to 'django/contrib/postgres/aggregates/general.py')
-rw-r--r-- | django/contrib/postgres/aggregates/general.py | 67 |
1 files changed, 5 insertions, 62 deletions
diff --git a/django/contrib/postgres/aggregates/general.py b/django/contrib/postgres/aggregates/general.py index 3de59dfcfd..c8eea1034d 100644 --- a/django/contrib/postgres/aggregates/general.py +++ b/django/contrib/postgres/aggregates/general.py @@ -3,7 +3,7 @@ import warnings from django.contrib.postgres.fields import ArrayField from django.db.models import Aggregate, BooleanField, JSONField, TextField, Value -from django.utils.deprecation import RemovedInDjango50Warning, RemovedInDjango51Warning +from django.utils.deprecation import RemovedInDjango51Warning from .mixins import OrderableAggMixin @@ -19,47 +19,11 @@ __all__ = [ ] -# RemovedInDjango50Warning -NOT_PROVIDED = object() - - -class DeprecatedConvertValueMixin: - def __init__(self, *expressions, default=NOT_PROVIDED, **extra): - if default is NOT_PROVIDED: - default = None - self._default_provided = False - else: - self._default_provided = True - super().__init__(*expressions, default=default, **extra) - - def resolve_expression(self, *args, **kwargs): - resolved = super().resolve_expression(*args, **kwargs) - if not self._default_provided: - resolved.empty_result_set_value = getattr( - self, "deprecation_empty_result_set_value", self.deprecation_value - ) - return resolved - - def convert_value(self, value, expression, connection): - if value is None and not self._default_provided: - warnings.warn(self.deprecation_msg, category=RemovedInDjango50Warning) - return self.deprecation_value - return value - - -class ArrayAgg(DeprecatedConvertValueMixin, OrderableAggMixin, Aggregate): +class ArrayAgg(OrderableAggMixin, Aggregate): function = "ARRAY_AGG" template = "%(function)s(%(distinct)s%(expressions)s %(ordering)s)" allow_distinct = True - # RemovedInDjango50Warning - deprecation_value = property(lambda self: []) - deprecation_msg = ( - "In Django 5.0, ArrayAgg() will return None instead of an empty list " - "if there are no rows. Pass default=None to opt into the new behavior " - "and silence this warning or default=[] to keep the previous behavior." - ) - @property def output_field(self): return ArrayField(self.source_expressions[0].output_field) @@ -87,27 +51,14 @@ class BoolOr(Aggregate): output_field = BooleanField() -class JSONBAgg(DeprecatedConvertValueMixin, OrderableAggMixin, Aggregate): +class JSONBAgg(OrderableAggMixin, Aggregate): function = "JSONB_AGG" template = "%(function)s(%(distinct)s%(expressions)s %(ordering)s)" allow_distinct = True output_field = JSONField() - # RemovedInDjango50Warning - deprecation_value = "[]" - deprecation_empty_result_set_value = property(lambda self: []) - deprecation_msg = ( - "In Django 5.0, JSONBAgg() will return None instead of an empty list " - "if there are no rows. Pass default=None to opt into the new behavior " - "and silence this warning or default=[] to keep the previous " - "behavior." - ) - # RemovedInDjango51Warning: When the deprecation ends, remove __init__(). - # - # RemovedInDjango50Warning: When the deprecation ends, replace with: - # def __init__(self, *expressions, default=None, **extra): - def __init__(self, *expressions, default=NOT_PROVIDED, **extra): + def __init__(self, *expressions, default=None, **extra): super().__init__(*expressions, default=default, **extra) if ( isinstance(default, Value) @@ -136,20 +87,12 @@ class JSONBAgg(DeprecatedConvertValueMixin, OrderableAggMixin, Aggregate): ) -class StringAgg(DeprecatedConvertValueMixin, OrderableAggMixin, Aggregate): +class StringAgg(OrderableAggMixin, Aggregate): function = "STRING_AGG" template = "%(function)s(%(distinct)s%(expressions)s %(ordering)s)" allow_distinct = True output_field = TextField() - # RemovedInDjango50Warning - deprecation_value = "" - deprecation_msg = ( - "In Django 5.0, StringAgg() will return None instead of an empty " - "string if there are no rows. Pass default=None to opt into the new " - 'behavior and silence this warning or default="" to keep the previous behavior.' - ) - def __init__(self, expression, delimiter, **extra): delimiter_expr = Value(str(delimiter)) super().__init__(expression, delimiter_expr, **extra) |