.. _aggregates: ========== Aggregates ========== .. currentmodule:: django_mysql.models MySQL-specific `database aggregates `_ for the ORM. The following can be imported from ``django_mysql.models``. .. class:: BitAnd(column) Returns an ``int`` of the bitwise ``AND`` of all input values, or 18446744073709551615 (a ``BIGINT UNSIGNED`` with all bits set to 1) if no rows match. Docs: `MySQL `__ / `MariaDB `__. Example usage: .. code-block:: pycon >>> Book.objects.create(bitfield=29) >>> Book.objects.create(bitfield=15) >>> Book.objects.all().aggregate(BitAnd("bitfield")) {'bitfield__bitand': 13} .. class:: BitOr(column) Returns an ``int`` of the bitwise ``OR`` of all input values, or 0 if no rows match. Docs: `MySQL `__ / `MariaDB `__. Example usage: .. code-block:: pycon >>> Book.objects.create(bitfield=29) >>> Book.objects.create(bitfield=15) >>> Book.objects.all().aggregate(BitOr("bitfield")) {'bitfield__bitor': 31} .. class:: BitXor(column) Returns an ``int`` of the bitwise ``XOR`` of all input values, or 0 if no rows match. Docs: `MySQL `__ / `MariaDB `__. Example usage: .. code-block:: pycon >>> Book.objects.create(bitfield=11) >>> Book.objects.create(bitfield=3) >>> Book.objects.all().aggregate(BitXor("bitfield")) {'bitfield__bitxor': 8} .. class:: GroupConcat(column, distinct=False, separator=',', ordering=None) An aggregate that concatenates values from a column of the grouped rows. Useful mostly for bringing back lists of ids in a single query. Docs: `MySQL `__ / `MariaDB `__. Example usage: .. code-block:: pycon >>> from django_mysql.models import GroupConcat >>> author = Author.objects.annotate(book_ids=GroupConcat("books__id")).get( ... name="William Shakespeare" ... ) >>> author.book_ids "1,2,5,17,29" .. warning:: MySQL will truncate the value at the value of ``group_concat_max_len``, which by default is quite low at 1024 characters. You should probably increase it if you're using this for any sizeable groups. ``group_concat_max_len`` docs: `MySQL `__ / `MariaDB `__. Optional arguments: .. attribute:: distinct=False If set to ``True``, removes duplicates from the group. .. attribute:: separator=',' By default the separator is a comma. You can use any other string as a separator, including the empty string. .. warning:: Due to limitations in the Django aggregate API, this is not protected against SQL injection. Don't pass in user input for the separator. .. attribute:: ordering=None By default no guarantee is made on the order the values will be in pre-concatenation. Set ordering to ``'asc'`` to sort them in ascending order, and ``'desc'`` for descending order. For example: .. code-block:: pycon >>> Author.objects.annotate(book_ids=GroupConcat("books__id", ordering="asc"))