본문 바로가기

문돌이 존버/Django 스터디

장고(Django) 모델을 통한 조회(기초)

반응형
본 글은 Holix의 "리액트와 함께 장고 시작하기 Complete" 강의를 듣고 작성한 일지입니다.

이번엔 장고에서 데이터베이스 질의 인터페이스를 제공하는 Model Manager 를 살펴보겠습니다. SQL 기능을 수행하지만 SQL문을 사용하는 것이 아니라 장고에서 별도로 제공하는 문법을 사용하면 되는 편하면서도 위험한(?) 기능입니다.

기본적인 문법부터 SQL 쿼리문과 비교해보도록 하겠습니다.

ModelCls.objects.all() # SELECT * FROM app_model;

ModelCls.objects.all().order_by('-id')[:10] # SELECT * FROM app_model ORDER BY id DESC LIMIT 10;

ModelCls.objects.create(title="New Title") # INSERT INTO app_model (title) VALUES ("New Title");

위에서 ModelCls.objects.all() 의 결과로는 QuerySet 이라는 순회가능한(iterable) 객체가 반환됩니다. 장고 쉘에 들어가서 확인해보겠습니다.

python manage.py shell
from blog1.models import Post
qs = Post.objects.all()
for post in qs:
    print("id: {id}, content: {content} {created_at}".format(**post.__dict__)) # key, value값을 넘길 땐 format(**...) 형식 이용

QuerySetChaining을 지원하는데요, 이는 쉽게 말해 뒤에 .method()를 계속 이어붙이면 새로운 QuerySet 이 생성됨을 의미합니다.

Post.objects.all().filter(content__startswith='감을')
Post.objects.all().filter(content__endswith='중')
# 극적인 Chaining 예시
Post.objects.all().filter(...).exclude(...).filter(...) # 새로운 QuerySet

QuerySet은 Lazy한 특성이 있어 만드는 동안에는 DB접근을 하지 않는다고 합니다. 실제로 데이터가 필요한 시점에 접근을 하는 것입니다. 데이터가 필요한 시점이란 아래와 같은 상황을 말합니다.

1. queryset
2. print(queryset)
3. list(queryset)
4. for instance in queryset:
    print(instance)

위에서 본 filter() 든, exclude() 든 1개 이상의 인자를 지정하려면 django.db.modelsQ 를 활용하면 됩니다. Qor 조건을 걸든, and 조건을 걸든 할 수 있습니다.

from django.db.models import Q

qs = Post.objects.all()
cond = Q(id__gte==1) & Q(content__icontains='감') # &: and / |: or
qs = qs.filter(cond)
print(qs.query)

gt: greater than
gte: greater than equal
lt: less than
lte: less than equal
icontains: ignore lower and upper case

만약 Q 를 활용하지 않는다면 fliter(id=1, content='다시 감을 익히는 중')  형식을 사용할 것인데, 이는 and 조건으로 or 조건을 이용하려면 Q 가 필요합니다.

728x90
반응형