3번째 줄: |
3번째 줄: |
| == 개요 == | | == 개요 == |
| 일반적으로 모델을 통해 DB를 정의하고 뷰를 통해 생성, 열람, 수정, 삭제 등의 과정을 수행한다. 이와 관련된 기능들을 QuerySet(쿼리셋)이라고 한다. 이곳에서 소개되지 않은 쿼리셋은 공식문서에서 살펴보도록. | | 일반적으로 모델을 통해 DB를 정의하고 뷰를 통해 생성, 열람, 수정, 삭제 등의 과정을 수행한다. 이와 관련된 기능들을 QuerySet(쿼리셋)이라고 한다. 이곳에서 소개되지 않은 쿼리셋은 공식문서에서 살펴보도록. |
| + | |
| + | === 가능하면 탬플릿에서.. === |
| + | 뷰에서 탬플릿으로 넘길 수 있지만.. 탬플릿 자체에서도 하위 객체를 불러오거나 정렬이 가능하다. [[5. 장고 탬플릿 DB 다루기]] 문서를 참고하자. |
| | | |
| =데이터 다루기= | | =데이터 다루기= |
22번째 줄: |
25번째 줄: |
| def index(request): | | def index(request): |
| c = 모델.objects.create(칼럼="내용", 칼럼2="내용2") | | c = 모델.objects.create(칼럼="내용", 칼럼2="내용2") |
| + | # 단순 생성이 아니라, 찾아보고 없을 때 생성하려면 아래처럼 진행한다. |
| + | c, 생성여부 = 모델.objects.get_or_create(칼럼="내용", 칼럼2="내용2") |
| </syntaxhighlight> | | </syntaxhighlight> |
| |- | | |- |
30번째 줄: |
35번째 줄: |
| from .models import 모델명 # 모델을 임포트 한다. | | from .models import 모델명 # 모델을 임포트 한다. |
| | | |
− | 객체 = 모델.objects.get(pk=기본키값) # 없으면 에러가 나는데, 서버에러로 인식한다. | + | 객체 = 모델.objects.get(pk=기본키값, 이외옵션.) # 없거나 2개 이상이면 에러가 나는데, 서버에러로 인식한다. |
| 객체 = 모델.objects.get(id=기본키값) # 위와 동일 | | 객체 = 모델.objects.get(id=기본키값) # 위와 동일 |
− | 객체 = 모델.objects.filter(id=기본키값) # 위와 동일 | + | 객체 = 모델.objects.filter(id=기본키값) # 위와 동일하나, 1개도 쿼리셋으로 가져온다. get처럼 쓰려면 맨 뒤에 .first() 혹은 .last()로 하나만 뽑아내자. |
− | 객체 = get_object_or_404(모델명, pk=기본키값) # 서버에러가 나지 않게끔 404 에러를 발생시킨다. | + | 객체 = get_object_or_404(모델, pk=기본키값) # 서버에러가 나지 않게끔 404 에러를 발생시킨다. |
| | | |
| | | |
68번째 줄: |
73번째 줄: |
| | | |
| <code>객체 = 모델.objects.get(id=pk)</code> | | <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> |
| ==데이터 불러오기== | | ==데이터 불러오기== |
| ===객체 다 가져오기=== | | ===객체 다 가져오기=== |
158번째 줄: |
169번째 줄: |
| ===특정단어 검색=== | | ===특정단어 검색=== |
| 속성에 특정 단어가 포함된 객체를 불러올 땐 다음과 같이 한다. <code>모델.objects.filter(속성__contains='장고')</code> (언더바가 2개임에 유의) | | 속성에 특정 단어가 포함된 객체를 불러올 땐 다음과 같이 한다. <code>모델.objects.filter(속성__contains='장고')</code> (언더바가 2개임에 유의) |
| + | |
| + | === 쿼리셋에서 제외하기 === |
| + | 필터가 아니라 외부에서 얻은 정보를 토대로 쿼리셋에서 지워야 하는 경우가 있다. |
| + | |
| + | 그럴 땐 쿼리셋 자체를 리스트로 만든 후 리스트에서 remove(객체)를 통해 제거하는 방법이 있다. |
| | | |
| == 다른 모델 불러오기 == | | == 다른 모델 불러오기 == |
172번째 줄: |
188번째 줄: |
| answer.question 을 사용하면 어느 질문에 달린 것인지, 질문의 id를 얻어올 수 있다. | | answer.question 을 사용하면 어느 질문에 달린 것인지, 질문의 id를 얻어올 수 있다. |
| | | |
− | 하위에서 상위모델로 갈 땐 <code>모델.상위모델</code> 형태로 접근. 하위모델에서 자신과 연결된 상위모델을 조회할 수 있다. | + | 하위에서 상위모델로 갈 땐 <code>모델.상위모델</code> 형태로 접근. 하위모델에서 자신과 연결된 상위모델을 조회할 수 있다.(다른 모델을 연결할 땐 대문자를 소문자로 바꾸어주어야 한다.) |
| | | |
− | 상위에서 하위모델로 갈 땐 <code>모델.하위모델_set</code> 형태로 접근.(_set은 아래로 간다는 방향을 지정해주기 위한 기능인듯) | + | 상위에서 하위모델로 갈 땐 <code>모델.하위모델_set.all()</code> 형태로 접근.(_set은 아래로 간다는 방향을 지정해주기 위한 것) |
| ====DB에 접근하는 경우==== | | ====DB에 접근하는 경우==== |
| DB의 칼럼에 접근하여 뽑아내는 경우, 상위모델을 뽑아낼 땐 '<code>모델.상위모델__속성명</code>' 형태로 접근할 수 있다.(모두 소문자로) | | DB의 칼럼에 접근하여 뽑아내는 경우, 상위모델을 뽑아낼 땐 '<code>모델.상위모델__속성명</code>' 형태로 접근할 수 있다.(모두 소문자로) |
241번째 줄: |
257번째 줄: |
| | | |
| posting에선 posting.tag.all() 형태로 연결된 객체셋을 얻을 수 있다. | | posting에선 posting.tag.all() 형태로 연결된 객체셋을 얻을 수 있다. |
| + | |
| + | posting.tag.add(tag객체) 형태로 태그와의 연결을 추가할 수 있다. |
| | | |
| == 데이터 조작하기 == | | == 데이터 조작하기 == |
246번째 줄: |
264번째 줄: |
| ===객체 정렬=== | | ===객체 정렬=== |
| 모델명.objects.order_by('속성') 형태로 정렬한다. 작은 것부터 보여주고 싶다면 속성 앞에 -를 붙이면 된다. | | 모델명.objects.order_by('속성') 형태로 정렬한다. 작은 것부터 보여주고 싶다면 속성 앞에 -를 붙이면 된다. |
| + | |
| + | 이미 불러온 객체들을 정렬하고 싶다면 <code>객체목록.order_by('속성')</code>으로 정렬할 수 있다. |
| <syntaxhighlight lang="python"> | | <syntaxhighlight lang="python"> |
| from django.shortcuts import render | | from django.shortcuts import render |
255번째 줄: |
275번째 줄: |
| 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> 형태로 사용한다. |
| | | |
| ===새로운 속성 만들어 사용하기=== | | ===새로운 속성 만들어 사용하기=== |
269번째 줄: |
294번째 줄: |
| ==유의== | | ==유의== |
| 탬플릿에선 위 속성들을 그대로 사용할 수 있지만, 괄호는 빼주고 기입한다. | | 탬플릿에선 위 속성들을 그대로 사용할 수 있지만, 괄호는 빼주고 기입한다. |
| + | |
| + | = 요약 = |
| + | |
| + | == 모델 조회 == |
| + | {| class="wikitable" |
| + | |- |
| + | !기능 |
| + | !설명 |
| + | |- |
| + | |all() |
| + | |모든 데이터셋을 가져온다. |
| + | |- |
| + | |get() |
| + | |조건에 맞는 것 하나. |
| + | |- |
| + | |filter() |
| + | |조건에 맞는 것 다. |
| + | |- |
| + | |exclude() |
| + | |조건에 맞는 것 빼고 다. |
| + | |- |
| + | |first() |
| + | |처음 하나. |
| + | |- |
| + | |last() |
| + | |마지막 하나. |
| + | |- |
| + | |exists() |
| + | |있나 없나 여부만 True, False로 반환. |
| + | 모델.objects.filter().exists() 형태로 활용. |
| + | |- |
| + | |order_by() |
| + | |조건에 따라 정리한다. |
| + | |} |
| [[분류:장고 뷰]] | | [[분류:장고 뷰]] |