Django ORM을 사용할 때, Sum function을 사용하면 음수에 대한 처리를 할 수 있는 방법이 없습니다. 예를 들어 아래와 같은 테이블과 모델이 있다고 가정해보겠습니다.

name amount
A 3
B 1
C -2
class Test(Model):
  name=CharField(max_length=1)
  amount=IntegerField()

이러한 경우 Django ORM의 Sum function을 사용하면 아래와 같이 2라는 결과를 얻을 수 있습니다.

result = Test.objects.annotate(
  normal_sum=Sum('amount')
).values(
  'summation'
)
print(result['summation'])  # 2  (3+1-2)

그러나 절대값으로 계산하고 싶은 경우, Django ORM에서 제공하는 aggregation function 중에는 절대값을 사용할 수 있는 Sum function이 없습니다. 그래서 django/db/models/aggregates.py 에 구현되어 있는 Count와 같은 function들을 참고하여 AbsoluteSum이라는 custom function을 구현하여 사용하게 되었습니다.

위와 같이 custom function을 구현해두고 이를 사용하면 절대값으로 합계를 구할 수 있습니다.

result = Test.objects.annotate(
  absolute_sum=AbsoluteSum('amount'),
  normal_sum=Sum('amount')
).values(
  'absolute_sum',
  'normal_sum'
)
print(str(result.query))  # SELECT (SUM(ABS(`test`.`amount`))) AS `absolute_sum`, (SUM(`test`.`amount`)) AS `normal_sum` FROM `test`
print(result['absolute_sum'])  # 6
print(result['normal_sum'])  # 2

만약 Django ORM에서 제공하지 않는 특수한 function이 필요하다면, 위와 유사한 방법으로 custom function을 구현하여 사용할 수 있습니다.