바뀜

2,597 바이트 추가됨 ,  2024년 7월 4일 (목) 16:57
잔글
편집 요약 없음
3번째 줄: 3번째 줄:  
== 개요 ==
 
== 개요 ==
 
일반적으로 모델을 통해 DB를 정의하고 뷰를 통해 생성, 열람, 수정, 삭제 등의 과정을 수행한다. 이와 관련된 기능들을 QuerySet(쿼리셋)이라고 한다. 이곳에서 소개되지 않은 쿼리셋은 공식문서에서 살펴보도록.
 
일반적으로 모델을 통해 DB를 정의하고 뷰를 통해 생성, 열람, 수정, 삭제 등의 과정을 수행한다. 이와 관련된 기능들을 QuerySet(쿼리셋)이라고 한다. 이곳에서 소개되지 않은 쿼리셋은 공식문서에서 살펴보도록.
 +
 +
=== 가능하면 탬플릿에서.. ===
 +
뷰에서 탬플릿으로 넘길 수 있지만.. 탬플릿 자체에서도 하위 객체를 불러오거나 정렬이 가능하다. [[5. 장고 탬플릿 DB 다루기]] 문서를 참고하자.
    
=데이터 다루기=
 
=데이터 다루기=
14번째 줄: 17번째 줄:  
|-
 
|-
 
|데이터 생성하기
 
|데이터 생성하기
 +
객체 생성
 
|모델에 해당하는 객체를 새로 만든다.
 
|모델에 해당하는 객체를 새로 만든다.
 
(테이블 안에 튜플을 하나 추가한다.)
 
(테이블 안에 튜플을 하나 추가한다.)
21번째 줄: 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>
 
|-
 
|-
29번째 줄: 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 에러를 발생시킨다.
      67번째 줄: 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>
 
==데이터 불러오기==
 
==데이터 불러오기==
 
===객체 다 가져오기===
 
===객체 다 가져오기===
157번째 줄: 169번째 줄:  
===특정단어 검색===
 
===특정단어 검색===
 
속성에 특정 단어가 포함된 객체를 불러올 땐 다음과 같이 한다. <code>모델.objects.filter(속성__contains='장고')</code> (언더바가 2개임에 유의)
 
속성에 특정 단어가 포함된 객체를 불러올 땐 다음과 같이 한다. <code>모델.objects.filter(속성__contains='장고')</code> (언더바가 2개임에 유의)
 +
 +
=== 쿼리셋에서 제외하기 ===
 +
필터가 아니라 외부에서 얻은 정보를 토대로 쿼리셋에서 지워야 하는 경우가 있다.
 +
 +
그럴 땐 쿼리셋 자체를 리스트로 만든 후 리스트에서 remove(객체)를 통해 제거하는 방법이 있다.
    
== 다른 모델 불러오기 ==
 
== 다른 모델 불러오기 ==
171번째 줄: 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>' 형태로 접근할 수 있다.(모두 소문자로)
235번째 줄: 252번째 줄:  
</syntaxhighlight>
 
</syntaxhighlight>
 
|}
 
|}
 +
 +
== 다대다 관계에서 ==
 +
예컨대 posting에서 tag 속성이 주어져 있다면 tag에선 하위속성에 접근하듯 tag.posting_set.all()로 posting객체에 접근할 수 있다.
 +
 +
posting에선 posting.tag.all() 형태로 연결된 객체셋을 얻을 수 있다.
 +
 +
posting.tag.add(tag객체) 형태로 태그와의 연결을 추가할 수 있다.
 +
 
== 데이터 조작하기 ==
 
== 데이터 조작하기 ==
    
===객체 정렬===
 
===객체 정렬===
 
모델명.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
248번째 줄: 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> 형태로 사용한다.
    
===새로운 속성 만들어 사용하기===
 
===새로운 속성 만들어 사용하기===
262번째 줄: 294번째 줄:  
==유의==
 
==유의==
 
탬플릿에선 위 속성들을 그대로 사용할 수 있지만, 괄호는 빼주고 기입한다.
 
탬플릿에선 위 속성들을 그대로 사용할 수 있지만, 괄호는 빼주고 기입한다.
 +
 +
= 요약 =
 +
 +
== 모델 조회 ==
 +
{| class="wikitable"
 +
|-
 +
!기능
 +
!설명
 +
|-
 +
|all()
 +
|모든 데이터셋을 가져온다.
 +
|-
 +
|get()
 +
|조건에 맞는 것 하나.
 +
|-
 +
|filter()
 +
|조건에 맞는 것 다.
 +
|-
 +
|exclude()
 +
|조건에 맞는 것 빼고 다.
 +
|-
 +
|first()
 +
|처음 하나.
 +
|-
 +
|last()
 +
|마지막 하나.
 +
|-
 +
|exists()
 +
|있나 없나 여부만 True, False로 반환.
 +
모델.objects.filter().exists() 형태로 활용.
 +
|-
 +
|order_by()
 +
|조건에 따라 정리한다.
 +
|}
 
[[분류:장고 뷰]]
 
[[분류:장고 뷰]]