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를 반환
* 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
'파이썬 python > django' 카테고리의 다른 글
[django] model object update 방법 정리 (1) | 2024.10.04 |
---|---|
[django] django로 포트포워딩(port forwarding)하는 방법 (w. middleware) (0) | 2024.07.25 |
[django] django template에서 settings.py variable불러오는 방법 (0) | 2024.05.09 |
[django] ImageField upload_to 동적 업로드(함수 사용) (0) | 2022.06.25 |
[django] debug_toolbar 세팅 (0) | 2022.06.22 |