mirror of https://github.com/jumpserver/jumpserver
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
29 lines
888 B
29 lines
888 B
4 years ago
|
from django.db.models import Aggregate
|
||
|
|
||
|
|
||
|
class GroupConcat(Aggregate):
|
||
|
function = 'GROUP_CONCAT'
|
||
|
template = '%(function)s(%(distinct)s %(expressions)s %(order_by)s %(separator))'
|
||
|
allow_distinct = False
|
||
|
|
||
|
def __init__(self, expression, distinct=False, order_by=None, separator=',', **extra):
|
||
|
order_by_clause = ''
|
||
|
if order_by is not None:
|
||
|
order = 'ASC'
|
||
|
prefix, body = order_by[1], order_by[1:]
|
||
|
if prefix == '-':
|
||
|
order = 'DESC'
|
||
|
elif prefix == '+':
|
||
|
pass
|
||
|
else:
|
||
|
body = order_by
|
||
|
order_by_clause = f'ORDER BY {body} {order}'
|
||
|
|
||
|
super().__init__(
|
||
|
expression,
|
||
|
distinct='DISTINCT' if distinct else '',
|
||
|
order_by=order_by_clause,
|
||
|
separator=f'SEPARATOR {separator}',
|
||
|
**extra
|
||
|
)
|