반응형
class CustomConcat(Aggregate):
function = 'GROUP_CONCAT'
allow_distinct = True
def __init__(self, expression, distinct=False, **extra):
# order by = group_concat 의 정렬 기준
# separator = group_concat 의 구분자(default = ",")
expr_separator = ''
expr_order_by = ''
order_by = extra.get('order_by')
separator = extra.get('separator')
if order_by:
expr_order_by = f' ORDER BY {order_by} '
if separator:
expr_separator = f' SEPARATOR \'{separator}\' '
self.template = f"%(function)s(%(distinct)s%(expressions)s{expr_order_by}{expr_separator})"
super(CustomConcat, self).__init__(expression,
distinct='DISTINCT ' if distinct else '',
output_field=CharField(),
**extra)
실제 사용 시에는
data = Table.objects.filter(**condition).annotate(
concat_ids=CustomConcat('column1', separator='\\n', order_by='Table.id')
)
처럼 구현하며, concat_ids 가 엔터로 구분되어 리턴 된다. 또한 ordering을 원래 하지 않으면 간혹 id가 뒤죽박죽으로 정렬되는 문제가 있으므로 위 처럼 order_by 부분을 id를 넣어서 활용할 수 있다.
반응형
'개발 이야기 > Django' 카테고리의 다른 글
Gunicorn 에서 print() output 이 로깅 되지 않을 때 해결법 (0) | 2023.11.22 |
---|---|
[Django] Replica DB 사용 시 읽기전용/쓰기전용 Database 분리하기 (0) | 2022.09.06 |
uwsgi processes, threads 값을 조정하여 서버 성능 향상하기 (0) | 2021.01.13 |
Request with Signature, Nonce by Using API Key & Secret pair & Validate Request (0) | 2020.12.30 |
Django Custom User Model & Custom Authentication (0) | 2020.12.30 |
댓글