Source code for django.contrib.postgres.aggregates.general

import warnings

from django.contrib.postgres.fields import ArrayField
from django.db.models import Aggregate, BooleanField, JSONField
from django.db.models import StringAgg as _StringAgg
from django.db.models import Value
from django.utils.deprecation import RemovedInDjango70Warning

from .mixins import _DeprecatedOrdering

__all__ = [
    "ArrayAgg",
    "BitAnd",
    "BitOr",
    "BitXor",
    "BoolAnd",
    "BoolOr",
    "JSONBAgg",
    "StringAgg",  # RemovedInDjango70Warning.
]


# RemovedInDjango61Warning: When the deprecation ends, replace with:
# class ArrayAgg(Aggregate):
[docs] class ArrayAgg(_DeprecatedOrdering, Aggregate): function = "ARRAY_AGG" allow_distinct = True allow_order_by = True @property def output_field(self): return ArrayField(self.source_expressions[0].output_field)
[docs] class BitAnd(Aggregate): function = "BIT_AND"
[docs] class BitOr(Aggregate): function = "BIT_OR"
[docs] class BitXor(Aggregate): function = "BIT_XOR"
[docs] class BoolAnd(Aggregate): function = "BOOL_AND" output_field = BooleanField()
[docs] class BoolOr(Aggregate): function = "BOOL_OR" output_field = BooleanField()
# RemovedInDjango61Warning: When the deprecation ends, replace with: # class JSONBAgg(Aggregate):
[docs] class JSONBAgg(_DeprecatedOrdering, Aggregate): function = "JSONB_AGG" allow_distinct = True allow_order_by = True output_field = JSONField()
# RemovedInDjango61Warning: When the deprecation ends, replace with: # class StringAgg(_StringAgg): # RemovedInDjango70Warning: When the deprecation ends, remove completely.
[docs] class StringAgg(_DeprecatedOrdering, _StringAgg): def __init__(self, expression, delimiter, **extra): if isinstance(delimiter, str): warnings.warn( "delimiter: str will be resolved as a field reference instead " "of a string literal on Django 7.0. Pass " f"`delimiter=Value({delimiter!r})` to preserve the previous behavior.", category=RemovedInDjango70Warning, stacklevel=2, ) delimiter = Value(delimiter) warnings.warn( "The PostgreSQL specific StringAgg function is deprecated. Use " "django.db.models.aggregates.StringAgg instead.", category=RemovedInDjango70Warning, stacklevel=2, ) super().__init__(expression, delimiter, **extra)