문제상황
Sum을 구할때 조건에 해당하는 row가 없으면 당연히 0이 나올것이라 생각했다.
def get_item_count_by_member(member):
result = Item.objects.filter(member=member, status=ItemStatusEnum.AVAILABLE).\
aggregate(total=Sum('quantity'))
return result.get('total')
하지만 결과는 0이 아니라 None이 나온다. 이런 경우에 조건에 만족하는 행이 단 하나도 없으면 0, 있으면 Sum을 수행한 값을 결과로 받고싶으려면 어떻게 해야할까?
Coalesce 함수 사용하기
Coalesce 함수는 null이 아닌 가장 첫번째 값을 리턴하는 함수이다. 인자로는 여러개를 넣을 수 있고, 그 중 null이 아닌 제일 첫번째 값을 리턴한다.
select Coalesce(type, 'default1', 'default2') FROM Item WHERE name = '테스트';
-- default1
select Sum(quantity) FROM Item WHERE name = 'asldkfjawlkefj';
-- NULL
select Count(quantity) FROM Item WHERE name = 'asldkfjawlkefj';
-- 0
select Coalesce(Sum(quantity)) FROM Item WHERE name = 'asldkfjawlkefj';
-- 0
Coalesce에 인자로 여러개를 넣을 수 있으며 순서대로 NULL이 아닌 값을 찾는다.
참고로 Count는 조건에 맞는 row가 없다면 0을 리턴한다.
장고에서는 django.db.models.functions에서 import해서 사용할 수 있다.
def get_item_count_by_member(member):
result = Item.objects.filter(member=member, status=ItemStatusEnum.AVAILABLE).\
aggregate(total=Coalesce(Sum('quantity'), 0))
return result.get('total')
참고
'Django,Python' 카테고리의 다른 글
[Django] Custom Command 만들기 (0) | 2024.04.06 |
---|---|
[Django] on_delete=CASCADE (3) | 2024.03.23 |
[Python] 파이썬의 typing (2) | 2024.03.09 |
[Django] Template script에서 view데이터 사용하기 (1) | 2024.02.24 |
MAMP로 Python CGI 테스트 해보기 (1) | 2024.01.12 |