1번째 줄: |
1번째 줄: |
| + | <youtube>https://www.youtube.com/watch?v=qoVvmzcCqAk</youtube> |
| + | |
| == 개요 == | | == 개요 == |
− | 일반적으로 모델을 통해 DB를 정의하고 뷰를 통해 생성, 열람, 수정, 삭제 등의 과정을 수행한다. 이와 관련된 기능들을 QuerySet이라고 한다. 이곳에서 소개되지 않은 쿼리셋은 공식문서에서 살펴보도록. | + | 일반적으로 모델을 통해 DB를 정의하고 뷰를 통해 생성, 열람, 수정, 삭제 등의 과정을 수행한다. 이와 관련된 기능들을 QuerySet(쿼리셋)이라고 한다. 이곳에서 소개되지 않은 쿼리셋은 공식문서에서 살펴보도록. |
| + | |
| + | === 가능하면 탬플릿에서.. === |
| + | 뷰에서 탬플릿으로 넘길 수 있지만.. 탬플릿 자체에서도 하위 객체를 불러오거나 정렬이 가능하다. [[5. 장고 탬플릿 DB 다루기]] 문서를 참고하자. |
| | | |
| =데이터 다루기= | | =데이터 다루기= |
| + | |
| + | == CRUD == |
| + | Create(생성), Read(읽기), Update(갱신), Delete(삭제) |
| + | {| class="wikitable" |
| + | !기능 |
| + | !설명 |
| + | !코드 |
| + | |- |
| + | |데이터 생성하기 |
| + | 객체 생성 |
| + | |모델에 해당하는 객체를 새로 만든다. |
| + | (테이블 안에 튜플을 하나 추가한다.) |
| + | |<syntaxhighlight lang="python"> |
| + | from .models import 모델명 # 모델을 임포트 한다. |
| + | |
| + | def index(request): |
| + | c = 모델.objects.create(칼럼="내용", 칼럼2="내용2") |
| + | # 단순 생성이 아니라, 찾아보고 없을 때 생성하려면 아래처럼 진행한다. |
| + | c, 생성여부 = 모델.objects.get_or_create(칼럼="내용", 칼럼2="내용2") |
| + | </syntaxhighlight> |
| + | |- |
| + | |데이터 불러오기 |
| + | |pk를 알면 다음과 같이 해당 객체를 불러올 수 있다. <code>모델.objects.get(id=pk)</code> |
| + | |기본적으로 모델을 임포트한 후에 불러온다.<syntaxhighlight lang="python"> |
| + | from django.shortcuts import get_object_or_404 # 기본키값에 해당하는 모델이 없을 경우 404 에러 반환. |
| + | from .models import 모델명 # 모델을 임포트 한다. |
| + | |
| + | 객체 = 모델.objects.get(pk=기본키값, 이외옵션.) # 없거나 2개 이상이면 에러가 나는데, 서버에러로 인식한다. |
| + | 객체 = 모델.objects.get(id=기본키값) # 위와 동일 |
| + | 객체 = 모델.objects.filter(id=기본키값) # 위와 동일하나, 1개도 쿼리셋으로 가져온다. get처럼 쓰려면 맨 뒤에 .first() 혹은 .last()로 하나만 뽑아내자. |
| + | 객체 = get_object_or_404(모델, pk=기본키값) # 서버에러가 나지 않게끔 404 에러를 발생시킨다. |
| + | |
| + | |
| + | </syntaxhighlight> |
| + | |- |
| + | |데이터 수정하기 |
| + | | |
| + | |<syntaxhighlight lang="python"> |
| + | def index(request): |
| + | c = 모델.objects.get(pk=기본키값) # 객체를 불러오고... |
| + | c.수정할칼럼 = "수정할 내용" |
| + | c.save() # 항상 저장을 해주어야 한다. |
| + | </syntaxhighlight> |
| + | |- |
| + | |데이터 삭제하기 |
| + | |조회, 조작한 후 <code>모델.delete()</code>를 실행. |
| + | |
| + | 해당 객체를 불러온 후 delete()를 붙여준다. |
| + | |
| + | |
| + | 여러 개를 동시에 삭제하고 싶은 경우 filter, exclude 등을 사용하여 조건에 맞는 것들을 선택한 후 통째로 삭제할 수 있다. |
| + | |<syntaxhighlight lang="python"> |
| + | def index(request): |
| + | c = 모델.objects.get(pk=기본키값) # 객체를 불러오고... |
| + | c.delete() |
| + | </syntaxhighlight><syntaxhighlight lang="python"> |
| + | def index(request): |
| + | 목록 = 모델.objects.exclude(조건).delete() # 조건을 제외한 것들을 삭제한다. |
| + | </syntaxhighlight> |
| + | |} |
| + | |
| + | ===객체의 속성에 접근=== |
| + | 모델.속성 형태로 속성에 접근 가능하다. 일반적으로 |
| + | |
| + | <code>객체 = 모델.objects.get(id=pk)</code> |
| + | |
| + | <code>객체 = 모델.objects.get(모델속성=특정속성)</code> |
| + | |
| + | 객체.속성 형태로 접근한다.(수정을 하고 반드시 저장을 해주어야 한다.) |
| + | |
| + | 서버에서 에러를 내고 싶으면 위 방식으로, 404 에러를 내고 싶으면 get_object_or_404를 사용하면 된다. |
| + | |
| + | <code>객체 = get_object_or_404(get_user_model(), nickname=user_nickname)</code> |
| ==데이터 불러오기== | | ==데이터 불러오기== |
| ===객체 다 가져오기=== | | ===객체 다 가져오기=== |
16번째 줄: |
94번째 줄: |
| === 모델의 pk 얻기 === | | === 모델의 pk 얻기 === |
| 모델명.id 가 pk이다. | | 모델명.id 가 pk이다. |
− | ===특정 객체 불러오기===
| + | =필터= |
− | pk를 알면 다음과 같이 해당 객체를 불러올 수 있다. <code>모델.objects.get(id=pk)</code><syntaxhighlight lang="python">
| |
− | from django.shortcuts import get_object_or_404 # 기본키값에 해당하는 모델이 없을 경우 404 에러 반환.
| |
− | from .models import 모델명 # 모델을 임포트 한다.
| |
− | | |
− | 객체 = 모델.objects.get(pk=기본키값) # 없으면 에러가 나는데, 서버에러로 인식한다.
| |
− | 객체 = 모델.objects.get(id=기본키값) # 위와 동일
| |
− | 객체 = 모델.objects.filter(id=기본키값) # 위와 동일
| |
− | 객체 = get_object_or_404(모델명, pk=기본키값) # 서버에러가 나지 않게끔 404 에러를 발생시킨다.
| |
− | | |
− | | |
− | </syntaxhighlight>
| |
− | ==필터 사용==
| |
| 특정 조건에 대해 True인 튜플들을 가져온다. | | 특정 조건에 대해 True인 튜플들을 가져온다. |
| | | |
38번째 줄: |
104번째 줄: |
| # 모델.objects는 객체목록을 받는다는 의미이다. | | # 모델.objects는 객체목록을 받는다는 의미이다. |
| def index(request): | | def index(request): |
− | 목록 = 모델.objects.filter(칼럼명="칼럼") # True가 나오는, >0 따위의 조건들을 건다. | + | 목록 = 모델.objects.filter(칼럼="내용") # True가 나오는, >0 따위의 조건들을 건다. |
| 목록2= 목록.objects.filter(조건들..) # 걸러진 객체들에 또다시 필터를 걸 수도 있다. | | 목록2= 목록.objects.filter(조건들..) # 걸러진 객체들에 또다시 필터를 걸 수도 있다. |
| </syntaxhighlight>필터는 몇번이라도 걸 수 있는데, 장고는 지연평가 방식을 사용하기 때문에 실제로 데이터를 질의하는 것은 한 번 뿐이다. 덕분에 부하가 걸리지 않고도 filter를 자유롭게 사용할 수 있다.<syntaxhighlight lang="python"> | | </syntaxhighlight>필터는 몇번이라도 걸 수 있는데, 장고는 지연평가 방식을 사용하기 때문에 실제로 데이터를 질의하는 것은 한 번 뿐이다. 덕분에 부하가 걸리지 않고도 filter를 자유롭게 사용할 수 있다.<syntaxhighlight lang="python"> |
| def index(request): | | def index(request): |
− | 목록 = 모델.objects.filter(칼럼명>0) | + | 목록 = 모델.objects.filter(조건) |
| .filter(조건) | | .filter(조건) |
| .filter(조건2) | | .filter(조건2) |
49번째 줄: |
115번째 줄: |
| 목록 = 모델.objects.filter(속성__startswith='시작할단어') | | 목록 = 모델.objects.filter(속성__startswith='시작할단어') |
| </syntaxhighlight> | | </syntaxhighlight> |
| + | |
| + | ===Fieldlookup=== |
| + | filter 안에서 언더바 2개로 작동하는 장고의 기능. |
| + | |
| + | 값__in 은 SELECT ... WHERE 값 IN ...; 과 대응한다. |
| + | |
| + | 조금 더 복잡한 DB query를 사용하기 위한 기능이다. |
| + | |
| + | 장고 도큐먼트를 보면.... 나온다. |
| ===범위 지정=== | | ===범위 지정=== |
| 필터 안에서 > 따위의 기호는 사용할 수 없다. 대신 __을 사용해 명령을 지정한다. | | 필터 안에서 > 따위의 기호는 사용할 수 없다. 대신 __을 사용해 명령을 지정한다. |
54번째 줄: |
129번째 줄: |
| !기능 | | !기능 |
| !설명 | | !설명 |
| + | !사용예시 |
| |- | | |- |
| |gt | | |gt |
| |greater than | | |greater than |
| + | | rowspan="4" |<syntaxhighlight lang="python"> |
| + | question_list= question_list.filter(create_date__gte= date) # greater than equal |
| + | |
| + | question_list = question_list.filter(create_date__lte=date) |
| + | |
| + | question_list = question_list.filter(created_date__range=(first_date, last_date)) |
| + | |
| + | </syntaxhighlight> |
| |- | | |- |
| |gte | | |gte |
66번째 줄: |
150번째 줄: |
| |lte | | |lte |
| |less than or equal to | | |less than or equal to |
− | |}<syntaxhighlight lang="python"> | + | |}이외 다양한 연산자를 사용할 수 있다. |
− | question_list= question_list.filter(create_date__gte= date) # greater than equal
| |
− | | |
− | question_list = question_list.filter(create_date__lte=date)
| |
− | | |
− | question_list = question_list.filter(created_date__range=(first_date, last_date))
| |
− | | |
− | </syntaxhighlight>이외 다양한 연산자를 사용할 수 있다.
| |
| | | |
| ===날짜데이터=== | | ===날짜데이터=== |
| 필터에 들어가는 날짜데이터는 datetime.date 형태의 데이터여야 한다. 다음과 같은 형태로 쓴다.<syntaxhighlight lang="python"> | | 필터에 들어가는 날짜데이터는 datetime.date 형태의 데이터여야 한다. 다음과 같은 형태로 쓴다.<syntaxhighlight lang="python"> |
− | time = request.GET.get('start').split('-') | + | time = request.GET.get('start').split('-') # 날짜데이터를 요소별로 구분한다. |
− | date = datetime(int(time[0]), int(time[1]), int(time[2])) | + | date = datetime(int(time[0]), int(time[1]), int(time[2])) # 문자열을 통해 시간객체를 만든다. |
− | date = datetime.date(date) | + | date = datetime.date(date) # 데이터형을 date로 바꾸어준다. |
| </syntaxhighlight> | | </syntaxhighlight> |
| ===제외하기=== | | ===제외하기=== |
| 필터가 True를 가져온다면 exclude는 False를 내는 튜플들을 가져온다. | | 필터가 True를 가져온다면 exclude는 False를 내는 튜플들을 가져온다. |
− |
| |
− |
| |
| 필터로 원하는 조건을 받아들이는 것과 반대로, 조건에 따라 제외하는 것도 가능하다. 필터와 동일하게 중첩으로 걸 수 있다.<syntaxhighlight lang="python"> | | 필터로 원하는 조건을 받아들이는 것과 반대로, 조건에 따라 제외하는 것도 가능하다. 필터와 동일하게 중첩으로 걸 수 있다.<syntaxhighlight lang="python"> |
| from django.shortcuts import render | | from django.shortcuts import render |
90번째 줄: |
165번째 줄: |
| | | |
| def index(request): | | def index(request): |
− | 목록 = 모델.objects.exclude(칼럼명 = True, >0 따위의 조건들...) | + | 목록 = 모델.objects.exclude(칼럼명 = True, __gte=0 따위의 조건들...) |
| </syntaxhighlight> | | </syntaxhighlight> |
| ===특정단어 검색=== | | ===특정단어 검색=== |
| 속성에 특정 단어가 포함된 객체를 불러올 땐 다음과 같이 한다. <code>모델.objects.filter(속성__contains='장고')</code> (언더바가 2개임에 유의) | | 속성에 특정 단어가 포함된 객체를 불러올 땐 다음과 같이 한다. <code>모델.objects.filter(속성__contains='장고')</code> (언더바가 2개임에 유의) |
| + | |
| + | === 쿼리셋에서 제외하기 === |
| + | 필터가 아니라 외부에서 얻은 정보를 토대로 쿼리셋에서 지워야 하는 경우가 있다. |
| + | |
| + | 그럴 땐 쿼리셋 자체를 리스트로 만든 후 리스트에서 remove(객체)를 통해 제거하는 방법이 있다. |
| + | |
| + | == 다른 모델 불러오기 == |
| | | |
| ===외래키 연결=== | | ===외래키 연결=== |
106번째 줄: |
188번째 줄: |
| answer.question 을 사용하면 어느 질문에 달린 것인지, 질문의 id를 얻어올 수 있다. | | answer.question 을 사용하면 어느 질문에 달린 것인지, 질문의 id를 얻어올 수 있다. |
| | | |
− | 하위에서 상위모델로 갈 땐 <code>모델.상위모델</code> 형태로 접근. 하위모델에서 자신과 연결된 상위모델을 조회할 수 있다. | + | 하위에서 상위모델로 갈 땐 <code>모델.상위모델</code> 형태로 접근. 하위모델에서 자신과 연결된 상위모델을 조회할 수 있다.(다른 모델을 연결할 땐 대문자를 소문자로 바꾸어주어야 한다.) |
| | | |
− | 상위에서 하위모델로 갈 땐 <code>모델.하위모델_set</code> 형태로 접근.(_set은 아래로 간다는 방향을 지정해주기 위한 기능인듯) | + | 상위에서 하위모델로 갈 땐 <code>모델.하위모델_set.all()</code> 형태로 접근.(_set은 아래로 간다는 방향을 지정해주기 위한 것) |
| ====DB에 접근하는 경우==== | | ====DB에 접근하는 경우==== |
− | DB의 칼럼에 접근하여 뽑아내는 경우, 상위모델을 뽑아낼 땐 '상위모델__속성명' 형태로 접근할 수 있다.(모두 소문자로) | + | DB의 칼럼에 접근하여 뽑아내는 경우, 상위모델을 뽑아낼 땐 '<code>모델.상위모델__속성명</code>' 형태로 접근할 수 있다.(모두 소문자로) |
| ===질문에서 답변 뽑아내기=== | | ===질문에서 답변 뽑아내기=== |
| 반대로 질문에서 여러 답변들이 어떤 게 달렸는지 추출할 수도 있다. | | 반대로 질문에서 여러 답변들이 어떤 게 달렸는지 추출할 수도 있다. |
124번째 줄: |
206번째 줄: |
| *혹시 related_name속성이 지정되어 있다면... 연결모델_set 형태가 안된다면, <code>모델.related_name.all()</code> 형태로 가져오기도 한다. | | *혹시 related_name속성이 지정되어 있다면... 연결모델_set 형태가 안된다면, <code>모델.related_name.all()</code> 형태로 가져오기도 한다. |
| ====related_name(역조회)==== | | ====related_name(역조회)==== |
− | 기본적으로 모델명_set으로 역조회를 할 수 있지만 이는 기본옵션이고, related_name을 설정해두면 모델명.related_name 으로 접근할 수 있다. | + | 기본적으로 모델명_set으로 역조회를 할 수 있지만 이는 기본옵션이고, related_name을 설정해두면 <code>모델명.related_name</code> 으로 접근할 수 있다.(모델.하위모델_set.all 이 아니라 바로 모델.related_name으로 접근이 가능해진다.) |
| | | |
| 같은 모델을 참조하는 모델 전체에 related_name옵션을 주어야 한다. | | 같은 모델을 참조하는 모델 전체에 related_name옵션을 주어야 한다. |
| | | |
| related_name='이름' 형태로. | | related_name='이름' 형태로. |
− | ===정렬하기===
| |
− | 모델명.objects.order_by('속성') 형태로 정렬한다. 작은 것부터 보여주고 싶다면 속성 앞에 -를 붙이면 된다.
| |
− | ===새로운 속성 만들어 사용하기===
| |
− | 정렬을 하는데 하위 모델의 갯수를 세어 정렬해야 할 때엔 새로운 속성을 만들어 적용해야 한다.
| |
| | | |
− | <code>모델.objects..order_by(Count='answer', '-create_date')</code> 형태로 작성이 되진 않는다. order_by 안의 괄호에 들어가야 하는 건 항상 속성 뿐이다. | + | 이런 역참조가 필요치 않은 경우엔 <code>related_name='+'</code>를 주면 된다.(혹은 맨 마지막에만 +를 넣어주어도 된다.) |
| + | |
| + | === 연결된 모델 조작하기 === |
| + | {| class="wikitable" |
| + | !기능 |
| + | !설명 |
| + | !코드 |
| + | |- |
| + | |불러오기 |
| + | |연결된 모델을 해당 모델의 이름을 통해 불러올 수 있다. |
| + | |<syntaxhighlight lang="python"> |
| + | 모델.objects.filter(연결한모델명__속성명__예약어) |
| + | |
| + | Publication.objects.filter(article__headline__startswith="NASA") |
| + | </syntaxhighlight> |
| + | |- |
| + | |관계더하기(상위) |
| + | |하위모델에서 상위모델을 지정하는 것. |
| + | |<syntaxhighlight lang="python"> |
| + | 모델.상위모델로연결된속성.set([상위모델객체를 담은 리스트]) |
| + | </syntaxhighlight> |
| + | |- |
| + | |관계더하기(하위) |
| + | |상위모델에서 하위모델을 지정하는 것. |
| + | |<syntaxhighlight lang="python"> |
| + | 모델.하위모델_set.add(하위모델객체1, 하위모델객체2, ...) |
| + | </syntaxhighlight> |
| + | |- |
| + | |관계제거(상위) |
| + | |상위로 연결된 관계를 제거한다. |
| + | |<syntaxhighlight lang="python"> |
| + | 모델.상위모델로연결되는속성.remove(상위모델객체) |
| + | </syntaxhighlight> |
| + | |- |
| + | |관계제거(하위) |
| + | |하위로 연결된 관계를 제거한다. |
| + | |<syntaxhighlight lang="python"> |
| + | 모델.하위모델명_set.remove(하위모델객체) |
| + | </syntaxhighlight> |
| + | |} |
| + | |
| + | == 다대다 관계에서 == |
| + | 예컨대 posting에서 tag 속성이 주어져 있다면 tag에선 하위속성에 접근하듯 tag.posting_set.all()로 posting객체에 접근할 수 있다. |
| | | |
− | 때문에 annotate를 사용해 새로운 속성을 만들어준 후에 oreder_by를 써야 한다. <code>모델.objects.annotate(num=Count('하위모델')).order_by('-num', '-create_date')</code> # -num으로 우선배치한 후, 같은 숫자가 나온다면 만들어진 순서로 우열을 정한다.)
| + | posting에선 posting.tag.all() 형태로 연결된 객체셋을 얻을 수 있다. |
| | | |
− | Count를 사용하기 위해선 <code>from django.db.models import Count</code> 가 필요하다.
| + | posting.tag.add(tag객체) 형태로 태그와의 연결을 추가할 수 있다. |
| | | |
| == 데이터 조작하기 == | | == 데이터 조작하기 == |
| | | |
| ===객체 정렬=== | | ===객체 정렬=== |
| + | 모델명.objects.order_by('속성') 형태로 정렬한다. 작은 것부터 보여주고 싶다면 속성 앞에 -를 붙이면 된다. |
| + | |
| + | 이미 불러온 객체들을 정렬하고 싶다면 <code>객체목록.order_by('속성')</code>으로 정렬할 수 있다. |
| <syntaxhighlight lang="python"> | | <syntaxhighlight lang="python"> |
| from django.shortcuts import render | | from django.shortcuts import render |
149번째 줄: |
272번째 줄: |
| #모델.objects는 객체목록을 받는다는 의미이다. | | #모델.objects는 객체목록을 받는다는 의미이다. |
| def index(request): | | def index(request): |
− | 목록 = 모델.objects.order_by('-create_date') #create_date속성의 역순으로 정리하라는 의미. | + | 목록 = 모델.objects.order_by('-create_date') # create_date속성의 역순으로 정리하라는 의미. |
| context={'템플릿에서 쓸 변수명':목록) | | context={'템플릿에서 쓸 변수명':목록) |
| return render(request, '템플릿', context) | | return render(request, '템플릿', context) |
− | </syntaxhighlight>order_by('?') 로 두면 객체들을 랜덤하게 배치한다. | + | </syntaxhighlight> |
| | | |
− | ===객체의 속성에 접근===
| + | * <code>order_by('?')</code> 로 두면 객체들을 랜덤하게 배치한다. |
− | 모델.속성 형태로 속성에 접근 가능하다. 일반적으로
| + | * <code>order_by('속성', '속성2', ...)</code>로 두면 여러 개의 기준으로 정렬할 수 있다. |
| + | * 속성이 다른 모델과 연결된 경우, <code>order_by('모델__속성')</code> 형태로 연결된 모델의 속성을 사용할 수도 있다. |
| + | * 하위속성을 가져와 정렬하는 경우 <code>school.homeroom_set.all().order_by('name')</code> 형태로 사용한다. |
| | | |
− | <code>객체 = 모델.objects.get(id=pk)</code>
| + | ===새로운 속성 만들어 사용하기=== |
| + | 정렬을 하는데 하위 모델의 갯수를 세어 정렬해야 할 때엔 새로운 속성을 만들어 적용해야 한다. |
| | | |
− | 객체.속성 형태로 접근한다.(수정을 하고 반드시 저장을 해주어야 한다.)
| + | <code>모델.objects.order_by(Count='answer', '-create_date')</code> 형태로 작성이 되진 않는다. order_by 안의 괄호에 들어가야 하는 건 항상 속성 뿐이다. |
| | | |
− | === 데이터 생성하기 ===
| + | 때문에 annotate를 사용해 새로운 속성을 만들어준 후에 oreder_by를 써야 한다. <code>모델.objects.annotate(num=Count('하위모델')).order_by('-num', '-create_date')</code> # -num으로 우선배치한 후, 같은 숫자가 나온다면 만들어진 순서로 우열을 정한다.) |
− | <syntaxhighlight lang="python"> | |
− | def index(request):
| |
− | c = 모델.objects.create(칼럼="내용", 칼럼2="내용2")
| |
− | </syntaxhighlight> | |
| | | |
− | === 데이터 수정하기 ===
| + | Count를 사용하기 위해선 <code>from django.db.models import Count</code> 가 필요하다. |
− | <syntaxhighlight lang="python"> | |
− | def index(request):
| |
− | c.수정할칼럼 = "수정할 내용"
| |
− | c.save() # 항상 저장을 해주어야 한다.
| |
− | </syntaxhighlight> | |
| | | |
− | === 데이터 삭제하기 ===
| |
− | 조회, 조작한 후 <code>모델.delete()</code>를 실행.
| |
| | | |
| + | ==유의== |
| + | 탬플릿에선 위 속성들을 그대로 사용할 수 있지만, 괄호는 빼주고 기입한다. |
| | | |
− | 해당 객체를 불러온 후 delete()를 붙여준다.<syntaxhighlight lang="python">
| + | = 요약 = |
− | def index(request):
| |
− | c.delete()
| |
− | </syntaxhighlight>여러 개를 동시에 삭제하고 싶은 경우 filter, exclude 등을 사용하여 조건에 맞는 것들을 선택한 후 통째로 삭제할 수 있다.<syntaxhighlight lang="python">
| |
− | def index(request):
| |
− | 목록 = 모델.objects.exclude(칼럼명 = True, >0 따위의 조건들...).delete() # 조건을 제외한 것들을 삭제한다.
| |
− | </syntaxhighlight>
| |
| | | |
− | ==유의== | + | == 모델 조회 == |
− | 탬플릿에선 위 속성들을 그대로 사용할 수 있지만, 괄호는 빼주고 기입한다.
| + | {| class="wikitable" |
| + | |- |
| + | !기능 |
| + | !설명 |
| + | |- |
| + | |all() |
| + | |모든 데이터셋을 가져온다. |
| + | |- |
| + | |get() |
| + | |조건에 맞는 것 하나. |
| + | |- |
| + | |filter() |
| + | |조건에 맞는 것 다. |
| + | |- |
| + | |exclude() |
| + | |조건에 맞는 것 빼고 다. |
| + | |- |
| + | |first() |
| + | |처음 하나. |
| + | |- |
| + | |last() |
| + | |마지막 하나. |
| + | |- |
| + | |exists() |
| + | |있나 없나 여부만 True, False로 반환. |
| + | 모델.objects.filter().exists() 형태로 활용. |
| + | |- |
| + | |order_by() |
| + | |조건에 따라 정리한다. |
| + | |} |
| [[분류:장고 뷰]] | | [[분류:장고 뷰]] |