장고 Orm 쿼리셋
장고 orm과 쿼리셋은 장고에서 가장 중요한 부분인것 같다 orm은 장고의 sql이라고 할 수 있는데 장고 orm을 통해서 데이터베이스에게 sql을 보낸다 이 과정은 orm -> sql로 변경되서 데이터 베이스에 접근한다
쿼리셋(QuerySet)이란 전달받은 모델의 객체 목록이라고 하는데 쿼리셋 필터나 정렬을 할 수 있다 파이썬의 기본 자료구조형이 아니기 때문에 자료형 변환이 필요하다
쿼리셋 필터링 메서드
예시들은 쿼리셋에 title을 표시하게 모델에서 설정해줬다 원래는 <QuerySet [<Post: Post object (6)>]>로 출력 된다
- all()
해당 모델의 모든 쿼리셋을 반환하는 메서드이다
` Post.object.all() -> <QuerySet [<Post: 첫번째 글입니다>, <Post: 두번째 글>, <Post: 세번째 글>, <Post: 네번째 글>, <Post: filter>, <Post: asd>]>`
- values()
모든 필드와 값을 쿼리셋으로 반환한다
Post.objects.values() -> <QuerySet [{'id': 1, 'title': '첫번째 글입니다', 'content': '1'}, {'id': 2, 'title': '두번째 글', 'content': '2'}, {'id': 3, 'title': '세번째 글', 'content': '3'}, {'id': 4, 'title': '네번째 글', 'content': '5'}, {'id': 5, 'title': 'filter', 'content': 'asdf'}, {'id': 6, 'title': 'asd', 'content': 'dddda'}]>
- order_by(‘id’)
위 메서드는 id값(기준)을 오름차순으로 반환한다 오름차순이 기본값이라 내림차순으로 정렬하고 싶다면 기준이 되는 필드 앞에 -를 붙이면 된다
Post.objects.order_by('-id') -> <QuerySet [<Post: 첫번째 글입니다>, <Post: 두번째 글>, <Post: 세번째 글>, <Post: 네번째 글>, <Post: filter>, <Post: asd>]>
- filter(조건)
필터안 조건에 따라 반환 되는 값이 바뀐다 보통 특정 문자열을 포함등 이런 필터를 이용한다
` Post.object.filter(title__icantains=’filter’) -> <QuerySet [<Post: filter>]>` 제목이 필터인 쿼리셋을 반환 했다
- exclude(조건)
필터안 조건을 제외해서 출력한다 filter의 반대 역할을 한다
Post.object.exclude(title__icontains='글') --> <QuerySet [<Post: asd>, <Post: filter>]>
title에서 글을 포함하지 않은 쿼리셋을 반환한다
- get(조건)
filter(조건).first()와 같은 역할을 한다 조건에 부합한 객체중 첫번째 객체를 반환 객체반환이라 뒤에 메서드 추가 불가능
- first()
Post.objects.first() -> 첫번째 글입니다 title을 리턴하기로 해서 title 출력 원래는 Post object (6) 출력
첫 객체를 반환
- last()
마지막 객체를 반환
- count()
쿼리셋의 개수를 반환한다
쿼리셋 슬라이싱
Post.objects.all()[0:3]와 같이 쿼리셋을 슬라이싱 할 수 있다 반환된 것은 쿼리셋
<QuerySet [<Post: 첫번째 글입니다>, <Post: 두번째 글>, <Post: 세번째 글>]>
하지만 Post.objects.all()[0:3:1]이렇게 증가값을 지정한다면 리스트로 반환한다
[<Post: 첫번째 글입니다>, <Post: 두번째 글>, <Post: 세번째 글>]
쿼리셋은 인덱싱 또한 지원하는데 Post.objects.all()[1]실행하면 첫 객체인 첫번째 글입니다가 반환된다
음수 인덱싱은 지원하지 않는다 print('슬라이싱',Post.objects.all()[-1])
쿼리셋의 특성
쿼리셋을 사용하다보면 여러 메서드를 겹쳐서 사용하는 경우가 많다 만약 메서드 마다 실행된다면 프로그램이 느려질 수 있다
하지만 쿼리셋은 Lazy한 특성을 가지고 있다 따라서 메서드를 바로 실행하지 않고 데이터가 필요한 시점에서 실행된다
- queryset을 사용할 때
- print(queryset) 출력
- list(queryset) 리스트 변환