파이썬 python/django

[django] annotate에 관하여...

Aytekin 2024. 7. 23. 11:33

django annotate 매서드는 queryset에 내가 원하는 값으로 계산해서 기존 queryset에 추가해줄 수 있다.

 

그럼 원하는 값으로 계산한다는 건 어떤 말이냐?

공식문서에서는 query expression이라고 표현하는데

F매서드를 사용해도 되고, Aggregate Func을 사용해서 값을 나타내도 된다.

 

annotate가 "주석을 단다"라는 뜻인데 django annotate는 "queryset에 주석을 달아주는데 주석의 값도 사용 가능"이라고 이해하면 될 듯 하다. (적어도 나에겐...)

 

아래는 공식문서에 나온 예시이다.

from django.db.models import Count
q = Blog.objects.annotate(Count("entry"))

# The name of the first blog
q[0].name
>>> 'Blogasaurus'

# The number of entries on the first blog
q[0].entry__count
>>> 42

Count라는 Aggregate Func을 사용해서 Blog 모델에서 entry라는 필드의 개수를 세주는 상황이다.

"필드명__AggregateFunc" 이렇게 조회할 수 있다.

꼭 이렇게 이름을 정해야 하는 건 아니고 내가 원하는대로 정할수도 있다.

q = Blog.objects.annotate(number_of_entries=Count("entry"))

# The number of entries on the first blog, using the name provided
q[0].number_of_entries
>>> 42

인자(argument)를 지정하고 annotate매서드를 사용하게 되면 지정한 인자(argument)를 alias로 사용할 수 있다.

 

정리하자면,

인자(argument)를 지정한 경우 : "인자(argument)"로 조회

인자(argument)를 지정하지 않은 경우 : "필드명__AggregateFunc"로 조회


 

django를 사용하다보면 진짜 활용법이 무궁무진하다.

DB를 직접 건드리지 않고 django라는 툴로 얼마든지 내가 원하는 작업들을 할 수 있는 것 같다.

DB때문에 sql만들었다가 다시 파이썬으로 와서 웹 개발하고 그럴 필요 없이 

django하나로 얼마든지 가능할 것 같다.

그런 의미에서 django는 사용하면 할수록 매력적이면서 점점 다른 프레임워크는 사용 못하도록 django의존적으로 만드는 것 같기도 하다.

 

 


 

* Annotate vs Aggregate 를 잘 설명해주는 그림이다. annotate는 queryset를 반환, aggregate는 dict를 반환

https://coffeebytes.dev/en/django-annotate-and-aggregate-explained/

 

* aggregation 관련해서 어떤 함수들을 사용할 수 있는지 확인하려면 아래 링크를 참조하길 바란다. https://docs.djangoproject.com/en/5.0/topics/db/aggregation/#cheat-sheet

 

* query expression에 관해서 자세히 알아보려면 아래 링크를 참조하길 바란다.

https://docs.djangoproject.com/en/5.0/ref/models/expressions/#query-expressions

 

728x90