바뀜

805 바이트 추가됨 ,  2021년 6월 2일 (수) 14:07
1번째 줄: 1번째 줄:  
== 개요 ==
 
== 개요 ==
일반적으로 모델을 통해 DB를 정의하고 뷰를 통해 생성, 열람, 수정, 삭제 등의 과정을 수행한다. 이와 관련된 기능들을 QuerySet이라고 한다. 이곳에서 소개되지 않은 쿼리셋은 공식문서에서 살펴보도록.
+
일반적으로 모델을 통해 DB를 정의하고 뷰를 통해 생성, 열람, 수정, 삭제 등의 과정을 수행한다. 이와 관련된 기능들을 QuerySet(쿼리셋)이라고 한다. 이곳에서 소개되지 않은 쿼리셋은 공식문서에서 살펴보도록.
    
=데이터 다루기=
 
=데이터 다루기=
 +
 +
== CRUD ==
 +
Create(생성), Read(읽기), Update(갱신), Delete(삭제)
 +
{| class="wikitable"
 +
!기능
 +
!설명
 +
!코드
 +
|-
 +
|데이터 생성하기
 +
|모델에 해당하는 객체를 새로 만든다.
 +
(테이블 안에 튜플을 하나 추가한다.)
 +
|<syntaxhighlight lang="python">
 +
from .models import 모델명  # 모델을 임포트 한다.
 +
 +
def index(request):
 +
    c = 모델.objects.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=기본키값)  # 없으면 에러가 나는데, 서버에러로 인식한다.
 +
객체 = 모델.objects.get(id=기본키값)  # 위와 동일
 +
객체 = 모델.objects.filter(id=기본키값)  # 위와 동일
 +
객체 = 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.delete()
 +
</syntaxhighlight><syntaxhighlight lang="python">
 +
def index(request):
 +
    목록 = 모델.objects.exclude(칼럼명 = True, >0 따위의 조건들...).delete()  # 조건을 제외한 것들을 삭제한다.
 +
</syntaxhighlight>
 +
|}
 
==데이터 불러오기==
 
==데이터 불러오기==
 
===객체 다 가져오기===
 
===객체 다 가져오기===
16번째 줄: 72번째 줄:  
=== 모델의 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인 튜플들을 가져온다.
   54번째 줄: 98번째 줄:  
!기능
 
!기능
 
!설명
 
!설명
 +
!사용예시
 
|-
 
|-
 
|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번째 줄: 119번째 줄:  
|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
110번째 줄: 154번째 줄:  
상위에서 하위모델로 갈 땐 <code>모델.하위모델_set</code> 형태로 접근.(_set은 아래로 간다는 방향을 지정해주기 위한 기능인듯)
 
상위에서 하위모델로 갈 땐 <code>모델.하위모델_set</code> 형태로 접근.(_set은 아래로 간다는 방향을 지정해주기 위한 기능인듯)
 
====DB에 접근하는 경우====
 
====DB에 접근하는 경우====
DB의 칼럼에 접근하여 뽑아내는 경우, 상위모델을 뽑아낼 땐 '상위모델__속성명' 형태로 접근할 수 있다.(모두 소문자로)
+
DB의 칼럼에 접근하여 뽑아내는 경우, 상위모델을 뽑아낼 땐 '<code>모델.상위모델__속성명</code>' 형태로 접근할 수 있다.(모두 소문자로)
 
===질문에서 답변 뽑아내기===
 
===질문에서 답변 뽑아내기===
 
반대로 질문에서 여러 답변들이 어떤 게 달렸는지 추출할 수도 있다.
 
반대로 질문에서 여러 답변들이 어떤 게 달렸는지 추출할 수도 있다.
124번째 줄: 168번째 줄:  
*혹시 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> 으로 접근할 수 있다.
    
같은 모델을 참조하는 모델 전체에 related_name옵션을 주어야 한다.
 
같은 모델을 참조하는 모델 전체에 related_name옵션을 주어야 한다.
    
related_name='이름' 형태로.
 
related_name='이름' 형태로.
===정렬하기===
  −
모델명.objects.order_by('속성') 형태로 정렬한다. 작은 것부터 보여주고 싶다면 속성 앞에 -를 붙이면 된다.
  −
===새로운 속성 만들어 사용하기===
  −
정렬을 하는데 하위 모델의 갯수를 세어 정렬해야 할 때엔 새로운 속성을 만들어 적용해야 한다.
  −
  −
<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으로 우선배치한 후, 같은 숫자가 나온다면 만들어진 순서로 우열을 정한다.)
  −
  −
Count를 사용하기 위해선 <code>from django.db.models import Count</code> 가 필요하다. 
      
== 데이터 조작하기 ==
 
== 데이터 조작하기 ==
    
===객체 정렬===
 
===객체 정렬===
 +
모델명.objects.order_by('속성') 형태로 정렬한다. 작은 것부터 보여주고 싶다면 속성 앞에 -를 붙이면 된다.
 
<syntaxhighlight lang="python">
 
<syntaxhighlight lang="python">
 
from django.shortcuts import render
 
from django.shortcuts import render
160번째 줄: 195번째 줄:     
객체.속성 형태로 접근한다.(수정을 하고 반드시 저장을 해주어야 한다.)
 
객체.속성 형태로 접근한다.(수정을 하고 반드시 저장을 해주어야 한다.)
 +
===새로운 속성 만들어 사용하기===
 +
정렬을 하는데 하위 모델의 갯수를 세어 정렬해야 할 때엔 새로운 속성을 만들어 적용해야 한다.
   −
=== 데이터 생성하기 ===
+
<code>모델.objects..order_by(Count='answer', '-create_date')</code> 형태로 작성이 되진 않는다. order_by 안의 괄호에 들어가야 하는 건 항상 속성 뿐이다.
<syntaxhighlight lang="python">
  −
def index(request):
  −
    c = 모델.objects.create(칼럼="내용", 칼럼2="내용2")
  −
</syntaxhighlight>
     −
=== 데이터 수정하기 ===
+
때문에 annotate를 사용해 새로운 속성을 만들어준 후에 oreder_by를 써야 한다. <code>모델.objects.annotate(num=Count('하위모델')).order_by('-num', '-create_date')</code> # -num으로 우선배치한 후, 같은 숫자가 나온다면 만들어진 순서로 우열을 정한다.)
<syntaxhighlight lang="python">
  −
def index(request):
  −
    c.수정할칼럼 = "수정할 내용"
  −
    c.save() # 항상 저장을 해주어야 한다.
  −
</syntaxhighlight>
     −
=== 데이터 삭제하기 ===
+
Count를 사용하기 위해선 <code>from django.db.models import Count</code> 가 필요하다.  
조회, 조작한 후 <code>모델.delete()</code>를 실행.
        −
해당 객체를 불러온 후 delete()를 붙여준다.<syntaxhighlight lang="python">
+
==유의==
def index(request):
+
탬플릿에선 위 속성들을 그대로 사용할 수 있지만, 괄호는 빼주고 기입한다.<syntaxhighlight lang="python">
    c.delete()
  −
</syntaxhighlight>여러 개를 동시에 삭제하고 싶은 경우 filter, exclude 등을 사용하여 조건에 맞는 것들을 선택한 후 통째로 삭제할 수 있다.<syntaxhighlight lang="python">
   
def index(request):
 
def index(request):
 
     목록 = 모델.objects.exclude(칼럼명 = True, >0 따위의 조건들...).delete()  # 조건을 제외한 것들을 삭제한다.
 
     목록 = 모델.objects.exclude(칼럼명 = True, >0 따위의 조건들...).delete()  # 조건을 제외한 것들을 삭제한다.
 
</syntaxhighlight>
 
</syntaxhighlight>
  −
==유의==
  −
탬플릿에선 위 속성들을 그대로 사용할 수 있지만, 괄호는 빼주고 기입한다.
   
[[분류:장고 뷰]]
 
[[분류:장고 뷰]]