회사 코드에 모르는 문법이나 알고만 있고 사용해보지 않은 것들을 종종 봤다. 이 기회에 한 번에 정리해보면 좋을 것 같아서 대표적인 10가지를 찾아봤다.
get(): 조건에 부합하는 하나의 객체를 조회 할 때 사용. 조건에 맞는 객체가 없거나 여러 개일 경우 에러 발생.
from myapp.models import MyModel
# id가 1인 객체를 조회
obj = MyModel.objects.get(id=1)
MyModel.DoesNotExistMultipleObjectsReturnedall(): 모든 객체 불러옴.
all_objects = MyModel.objects.all()
filter(): 조건에 해당하는 객체를 필터링하여 여러 개를 가져옴. 조건이 없으면 빈 QuerySet 반환
filtered_objects = MyModel.objects.filter(name='Hyoil')
exclude(): 조건에 해당하지 않는 객체를 가져옴
excluded_objects = MyModel.objects.exclude(age__lt=20) # age가 20 미만인 것을 제외
*lt: less than(미만)
order_by: QuerySet의 정렬을 지정
sorted_objects = MyModel.objects.order_by('name') # 이름 오름차순 정렬
reverse_sorted_objects = MyModel.objects.order_by('-name') # 이름 내림차순 정렬
values(): QuerySet에서 특정 필드만 가져옴. 결과는 dict 형태로 반환
values_queryset = MyModel.objects.values('id', 'name')
value_list(): tuple 형태로 특정 필드만 가져옴
values_list_queryset = MyModel.objects.values_list('id', 'name')
# flat=True로 설정하면 단일 필드의 값만 리스트로 반환
ids = MyModel.objects.values_list('id', flat=True)
Q object: 복잡한 조건을 생성하거나 OR 조건을 사용할 때 유용
from django.db.models import Q
or_query = MyModel.objects.filter(Q(name='Hyoil') | Q(age=29)) # 이름이 Hyoil이거나 나이가 29인 경우
and_query = MyModel.objects.filter(Q(name='Hyoil') & Q(age=29)) # 이름이 Hyoil이고 나이가 29인 경우
aggregate(): 데이터를 집계하여 계산
from django.db.models import Max, Min
result = Employee.objects.aggregate(max_salary=Max('salary'), min_salary=Min('salary'))
# print(result)
# {'max_salary': 60000.0, 'min_salary': 45000.0}
annotate(): 각 객체(또는 그룹)에 통계 데이터 추가
from django.db.models import Avg
result = Employee.objects.values('department').annotate(avg_salary=Avg('salary'))
# print(result)
'''
<QuerySet [
{'department': 'HR', 'avg_salary': 51000.0},
{'department': 'IT', 'avg_salary': 57500.0},
{'department': 'Marketing', 'avg_salary': 46000.0}
]>
'''
first() / last(): QuerySet에서 첫 번째 또는 마지막 객체를 가져옴
first_obj = MyModel.objects.first()
last_obj = MyModel.objects.last()
exist(): 조건에 맞는 데이터가 존재하는지 확인
is_exist = MyModel.objects.filter(name='Hyoil').exists()
[:N] slicing: QuerySet에 python 문법 slicing을 적용
first_three_objects = MyModel.objects.all()[:3] # 처음 3개 가져오기
skipped_objects = MyModel.objects.all()[3:6] # 3번째부터 6번째까지 가져오기
복잡한 쿼리를 사용할 때 raw()를 통해 SQL을 직접 사용할 수 있다
raw_query = MyModel.objects.raw('SELECT * FROM myapp_mymodel WHERE name = %s', ['Hyoil'])
해당 항목은 따로 글을 작성 해야 할 정도로 내용이 있기 때문에 간략히만 적었다.