쿼리셋(queryset)
쿼리셋은 DB로 부터 전달받은 모델의 객체 목록
장고 쉘에서 쿼리셋을 사용할 수 있음
● 장고 쉘 켜기
(myvenv) ~/mysite$ python manage.py shell
→ 결과 : 인터렉티브 콘솔(장고쉘)이 켜짐
(InteractiveConsole)
>>>
● all : 객체 전체 조회
>>> from notice.models import Notice, Reply # 장고 쉘로 모델 import
>>> Notice.objects.all()
<QuerySet [<Notice: 알려드립니다.>, <Notice: 이용 안내>]>
● create(key = value) : 객체 생성
>>> from django.contrib.auth.models import User
>>> me = User.objects.get(username='master')
>>> Notice.objects.create(writer=me, title='점검 안내', content='내일 점검합니다.')
● filter(key = value) : 필터링
>>> Notice.objects.filter(writer=me)
[<Notice: 점검 안내>]
● order_by(‘속성’) : 정렬
>>> Notice.objects.order_by('title') # 오름차순
[<Notice: 알려드립니다.>, <Notice: 이용 안내>, <Notice: 점검 안내>]
>>> Notice.objects.order_by('-title') # 내림차순
[<Notice: 점검 안내>, <Notice: 이용 안내>, <Notice: 알려드립니다.>]
>>> Notice.objects.order_by('user__first_name') # User 모델의 first_name 컬럼 오름차순
▷ 관계를 갖은 다른 모델의 컬럼에 접근할 때는 더블 언더스코어(__, 던더)를 사용함 (lookups across relationships)
● get(key = ‘value’) : 단일행 가져오기
- 결과 행이 여러개일 시 오류발생, where절 역할
● values([‘속성’]) : value 가져오기
- dictioinary 형태로 반환
>>> Blog.objects.values() # 전체 속성
<QuerySet [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]>
>>> Blog.objects.values('id', 'name') # 일부 속성
<QuerySet [{'id': 1, 'name': 'Beatles Blog'}]>
- 모델객체를 가져온 후 내부의 값을 확인하고 싶을 때 사용해도 됨
>>> Notice.objects.get(id=2)
<Notice : Notice object (2)>
>>> Notice.objects.get(id=2).values()
<Queryset [{'id':2, 'writer':'master', 'title':'공지', 'content':'점검예정입니다.'}]>
# get과 filter 사용시 value 가져올 때의 차이점
>>> Profile.objects.get(user=user.id)
Profile object (1)
>>> Profile.objects.get(user=user.id).point
12.0
>>> Profile.objects.filter(user=user.id)
<QuerySet [<Profile: Profile object (1)>]>
>>> Profile.objects.filter(user=user.id).values('point')
12.0
→ get()의 경우 1개만 가져오는 것이기 때문에 바로 컬럼으로 접근가능
→ filter()의 경우 여러개를 가져오는 것이라 QuerySet 자료형임. values()를 사용하여 컬럼으로 접근해야 함
● exclude([key = ‘value’]) : 배제하고 가져오기
>>> Notice.objects.exclude(title='') # title이 공백인 자료는 제외하고 가져오기
● distinct(‘속성’) : 중복제거하고 가져오기
>>> Notice.objects.distinct('content') # content 중복 제거하고 가져오기
● annotate() : 별칭 지정
from django.db.models import Count
>>> Notice.objects.annotate(total=Count('id')) # id의 갯수를 total로 명명
→ total이라는 칼럼을 새로 만들었다고 생각
조건 키워드 : get(), filter() 사용시, and로 결합
키워드 | 설명 | example |
__lt / __gt (litter / greater) |
~보다 작다 / ~보다 크다 | id>3 검색 » Notice.objects.filter(id__gt = 3) |
__lte / __gte | ~보다 같거나 작다 / ~보다 같거나 크다 | |
__in | 포함 (= or) | id가 2, 3 검색 » Notice.objects.filter(id__in = [2, 3]) |
__year / __month / __day | 해당 년도, 월, 일 검색 | » Notice.objects.filter(pub_date=2020) |
__isnull | null인지 | » Notice.objects.filter(file__isnull=True) |
__contaions / __icontains | 포함하는지 (icontains는 대소문자 구분 X) | 내용에 ‘고객’이 포함되는 것 검색 » Notice.objects.filter(content__contains=’고객’) |
__startswith / __istartswith | 시작문자열 (istartswith는 대소문자 구분 X) | |
__endswith / __iendswith | 끝문자열 (iendswith는 대소문자 구분 X) | |
__range | 범위 (= between) |
id가 2~8 검색 » Notice.objects.filter(id__range = (2, 9)) |