[Django] DB 데이터를 조회하는 10가지 방법 근데 이제 ORM을 곁들인..

김효일·2024년 11월 25일

회사 코드에 모르는 문법이나 알고만 있고 사용해보지 않은 것들을 종종 봤다. 이 기회에 한 번에 정리해보면 좋을 것 같아서 대표적인 10가지를 찾아봤다.

1. 단일 객체

get(): 조건에 부합하는 하나의 객체를 조회 할 때 사용. 조건에 맞는 객체가 없거나 여러 개일 경우 에러 발생.

from myapp.models import MyModel

# id가 1인 객체를 조회
obj = MyModel.objects.get(id=1)
  • 없으면 발생하는 에러: MyModel.DoesNotExist
  • 여러 개가 있을 경우 발생하는 에러: MultipleObjectsReturned

2. 다중 객체

all(): 모든 객체 불러옴.

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(미만)

3. 정렬

order_by: QuerySet의 정렬을 지정

sorted_objects = MyModel.objects.order_by('name')  # 이름 오름차순 정렬
reverse_sorted_objects = MyModel.objects.order_by('-name')  # 이름 내림차순 정렬

4. 특정 필드

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)

5. 조건 추가 및 조합

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인 경우

6. Aggregation 및 그룹화

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}
]>
'''

7. 첫 번째 또는 마지막 객체

first() / last(): QuerySet에서 첫 번째 또는 마지막 객체를 가져옴

first_obj = MyModel.objects.first()
last_obj = MyModel.objects.last()

8. 존재 여부 확인

exist(): 조건에 맞는 데이터가 존재하는지 확인

is_exist = MyModel.objects.filter(name='Hyoil').exists()

9. 제한 및 건너뛰기

[:N] slicing: QuerySet에 python 문법 slicing을 적용

first_three_objects = MyModel.objects.all()[:3]  # 처음 3개 가져오기
skipped_objects = MyModel.objects.all()[3:6]  # 3번째부터 6번째까지 가져오기
  • 슬라이싱은 데이터베이스 쿼리에서 효율적으로 작동

10. Raw SQL

복잡한 쿼리를 사용할 때 raw()를 통해 SQL을 직접 사용할 수 있다

raw_query = MyModel.objects.raw('SELECT * FROM myapp_mymodel WHERE name = %s', ['Hyoil'])

ORM 사용 시 주의 사항

해당 항목은 따로 글을 작성 해야 할 정도로 내용이 있기 때문에 간략히만 적었다.

  • Lazy Evaluation: Django ORM은 실제 데이터가 필요할 때까지 쿼리를 실행하지 않는다.
  • 효율성: 불필요한 데이터 로드와 쿼리 반복을 피하기 위해 필요한 데이터만 가져오도록 설계해야 한다.
profile
기록을 통한 성장

0개의 댓글