MySQL의 GROUP_CONCAT에 해당하는 Django
Django 프로젝트에서는 쿼리를 실행하여 다양한 유형의 개수와 쉼표를 검색할 수 있습니다. 이름이 구분된 목록입니다. MySQL은 이 작업을 위해 GROUP_CONCAT 함수를 제공하지만 Django에 해당하는 함수를 찾는 것은 까다로울 수 있습니다.
'과일':
ID | 유형 | 이름 |
---|---|---|
0 | 사과 | 후지 |
1 | 사과 | mac |
2 | 주황색 | 배럴 |
원하는 출력 상태:
유형 | 개수 | 이름 |
---|---|---|
사과 | 2 | "fuji,mac" |
주황색 | 1 | "navel" |
관습 집계 함수
원시 SQL 쿼리 없이 이를 달성하려면 Django에서 사용자 정의 집계 함수를 생성하세요.프로젝트에 다음 코드를 추가하세요:from django.db.models import Aggregate class Concat(Aggregate): function = 'GROUP_CONCAT' template = '%(function)s(%(distinct)s%(expressions)s)' def __init__(self, expression, distinct=False, **extra): super(Concat, self).__init__( expression, distinct='DISTINCT ' if distinct else '', output_field=CharField(), **extra)from django. db.models 가져오기 집계 클래스 Concat(집계): 함수 = 'GROUP_CONCAT' template = '%(함수)s(%(distinct)s%(expressions)s)' def __init__(self, 표현식, independent=False, **extra): super(Concat, self).__init__( 표현, 뚜렷한='DISTINCT ', 다른 경우 '', 출력 필드=CharField(), **extra)
사용법
다음과 같이 사용자 정의 집계 함수를 사용합니다:from django.db.models import Aggregate class Concat(Aggregate): function = 'GROUP_CONCAT' template = '%(function)s(%(distinct)s%(expressions)s)' def __init__(self, expression, distinct=False, **extra): super(Concat, self).__init__( expression, distinct='DISTINCT ' if distinct else '', output_field=CharField(), **extra)query_set = Fruits.objects.values('type'). 주석을 달다( 개수=개수('유형'), 이름=Concat('이름') ).order_by('-count')이 쿼리는 원하는 출력이 포함된 QuerySet을 반환합니다.
출력 예
'과일 ' 테이블에서 query_set에는 다음이 포함됩니다:from django.db.models import Aggregate class Concat(Aggregate): function = 'GROUP_CONCAT' template = '%(function)s(%(distinct)s%(expressions)s)' def __init__(self, expression, distinct=False, **extra): super(Concat, self).__init__( expression, distinct='DISTINCT ' if distinct else '', output_field=CharField(), **extra){ '유형': '사과', '개수': 2, '이름': '후지,맥' }, { '유형': '주황색', '개수': 1, '이름': '배럴' },
결론
사용자 정의 집계 함수를 생성하면 Django에서 GROUP_CONCAT과 유사한 기능을 쉽게 달성할 수 있으므로 다양한 값의 개수를 검색하고 데이터베이스 테이블의 관련 이름 또는 값을 쉼표로 구분한 목록입니다.부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3