장고:view 각종 기능: 두 판 사이의 차이
편집 요약 없음 |
|||
1번째 줄: | 1번째 줄: | ||
{{장고}} | {{장고}} | ||
= 데이터 다루기 = | |||
==데이터 불러오기== | ==데이터 불러오기== | ||
===모델의 pk 얻기=== | ===모델의 pk 얻기=== | ||
모델명.id 가 pk이다. | 모델명.id 가 pk이다.<br /> | ||
<br /> | |||
===객체 조회=== | ===객체 조회=== | ||
pk를 알면 다음과 같이 해당 객체를 불러올 수 있다. <code>모델.objects.get(id=pk)</code><syntaxhighlight lang="python"> | pk를 알면 다음과 같이 해당 객체를 불러올 수 있다. <code>모델.objects.get(id=pk)</code><syntaxhighlight lang="python"> | ||
108번째 줄: | 107번째 줄: | ||
이처럼 속성을 가져오는 것은 탬플릿에서도 사용이 가능하다. | 이처럼 속성을 가져오는 것은 탬플릿에서도 사용이 가능하다. | ||
==== 잘 안될 때 ==== | ====잘 안될 때==== | ||
굳이 또 다른 모델을 임포트 할 필요는 없다.(연결된 모델이 다른 앱에 있다 하더라도) | 굳이 또 다른 모델을 임포트 할 필요는 없다.(연결된 모델이 다른 앱에 있다 하더라도) | ||
* 유의할 점. 연결모델의 이름은 대문자가 들어갔다 하더라도 전부 소문자로 바꾸어 가져와야 한다. | *유의할 점. 연결모델의 이름은 대문자가 들어갔다 하더라도 전부 소문자로 바꾸어 가져와야 한다. | ||
* 혹시 related_name속성이 지정되어 있다면... 연결모델_set 형태가 안된다면, <code>모델.related_name.all()</code> 형태로 가져오기도 한다. | *혹시 related_name속성이 지정되어 있다면... 연결모델_set 형태가 안된다면, <code>모델.related_name.all()</code> 형태로 가져오기도 한다. | ||
====related_name(역조회)==== | ====related_name(역조회)==== | ||
121번째 줄: | 120번째 줄: | ||
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> 가 필요하다. | |||
<br /> | |||
==유의== | ==유의== | ||
탬플릿에선 위 속성들을 그대로 사용할 수 있지만, 괄호는 빼주고 기입한다. | 탬플릿에선 위 속성들을 그대로 사용할 수 있지만, 괄호는 빼주고 기입한다. |
2020년 12월 7일 (월) 22:34 판
장고! 웹 프레임워크! 틀:장고
데이터 다루기
데이터 불러오기
모델의 pk 얻기
모델명.id 가 pk이다.
객체 조회
pk를 알면 다음과 같이 해당 객체를 불러올 수 있다. 모델.objects.get(id=pk)
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=기본키값) #서버에러가 나지 않게끔.
목록 조회
from django.shortcuts import render
from .models import 모델명#모델을 임포트 한다.
#모델.objects는 객체목록을 받는다는 의미이다.
def index(request):
목록 = 모델.objects.order_by('-create_date') #create_date속성의 역순으로 정리하라는 의미.
context={'템플릿에서 쓸 변수명':목록)
return render(request, '템플릿', context)
객체 다 가져오기
from django.shortcuts import render
from .models import 모델명#모델을 임포트 한다.
#모델.objects는 객체목록을 받는다는 의미이다.
def index(request):
목록 = 모델.objects.all
모델.objects.all[:5] 처럼 상위 5개만 가져오는 방식도 가능.
필터로 걸러서 가져오기
from django.shortcuts import render
from .models import 모델명#모델을 임포트 한다.
#모델.objects는 객체목록을 받는다는 의미이다.
def index(request):
목록 = 모델.objects.filter(칼럼명 = True, >0 따위의 조건들...)
목록2= 목록.objects.filter(조건들..)#객체에 또다시 필터를 걸 수도 있다.
필터는 몇번이라도 걸 수 있는데, 장고는 지연평가 방식을 사용하기 때문에 실제로 데이터를 질의하는 것은 한 번 뿐이다. 덕분에 부하가 걸리지 않고도 filter를 자유롭게 사용할 수 있다.
def index(request):
목록 = 모델.objects.filter(칼럼명 = True, >0 따위의 조건들...)
.filter(조건)
.filter(조건2)
filter에서 각종 연산자를 사용할 땐 '__'를 붙인다.
def index(request):
목록 = 모델.objects.filter(속성__startswith='시작할단어')
제외하기
필터로 원하는 조건을 받아들이는 것과 반대로, 조건에 따라 제외하는 것도 가능하다. 필터와 동일하게 중첩으로 걸 수 있다.
from django.shortcuts import render
from .models import 모델명#모델을 임포트 한다.
def index(request):
목록 = 모델.objects.exclude(칼럼명 = True, >0 따위의 조건들...)
삭제하기
해당 객체를 불러온 후 delete()를 붙여준다.
def index(request):
목록 = 모델.objects.exclude(칼럼명 = True, >0 따위의 조건들...).delete() #조건을 제외한 것들을 삭제한다.
특정단어 검색
속성에 특정 단어가 포함된 객체를 불러올 땐 다음과 같이 한다. 모델.objects.filter(속성__contains='장고')
(언더바가 2개임에 유의)
객체의 속성에 접근
모델.속성 형태로 속성에 접근 가능하다. 일반적으로
객체 = 모델.objects.get(id=pk)
객체.속성 형태로 접근한다.(수정을 하고 반드시 저장을 해주어야 한다.)
외래키 연결
모델에서 외래키로 1:N 연결을 한 경우.
외래키가 연결된 모델의 경우, 외래키 필드에 해당 키의 아이디(pk)를 넣어주면 된다.
ex) answer(question=질문키, 기타등등 필드 채우기)
이후 answer.save()를 하면 해당 질문에 대한 답변이 저장된다.
answer.question 을 사용하면 어느 질문에 달린 것인지, 질문의 id를 얻어올 수 있다.
하위에서 상위모델로 갈 땐 모델.상위모델
형태로 접근. 하위모델에서 자신과 연결된 상위모델을 조회할 수 있다.
상위에서 하위모델로 갈 땐 모델.하위모델_set
형태로 접근.
질문에서 답변 뽑아내기
반대로 질문에서 여러 답변들이 어떤 게 달렸는지 추출할 수도 있다.
모델.연결모델_set.all() 를 실행하면 모델에 foreign키로 연결모델들 객체를 얻을 수 있다.
모델.연결모델_set.count() 는 몇 개가 있는지 세어주고.
이처럼 속성을 가져오는 것은 탬플릿에서도 사용이 가능하다.
잘 안될 때
굳이 또 다른 모델을 임포트 할 필요는 없다.(연결된 모델이 다른 앱에 있다 하더라도)
- 유의할 점. 연결모델의 이름은 대문자가 들어갔다 하더라도 전부 소문자로 바꾸어 가져와야 한다.
- 혹시 related_name속성이 지정되어 있다면... 연결모델_set 형태가 안된다면,
모델.related_name.all()
형태로 가져오기도 한다.
기본적으로 모델명_set으로 역조회를 할 수 있지만 이는 기본옵션이고, related_name을 설정해두면 모델명.related_name 으로 접근할 수 있다.
같은 모델을 참조하는 모델 전체에 related_name옵션을 주어야 한다.
related_name='이름' 형태로.
정렬하기
모델명.objects.order_by('속성') 형태로 정렬한다. 작은 것부터 보여주고 싶다면 속성 앞에 -를 붙이면 된다.
새로운 속성 만들어 사용하기
정렬을 하는데 하위 모델의 갯수를 세어 정렬해야 할 때엔 새로운 속성을 만들어 적용해야 한다.
모델.objects..order_by(Count='answer', '-create_date')
형태로 작성이 되진 않는다. order_by 안의 괄호에 들어가야 하는 건 항상 속성 뿐이다.
때문에 annotate를 사용해 새로운 속성을 만들어준 후에 oreder_by를 써야 한다. 모델.objects.annotate(num=Count('하위모델')).order_by('-num', '-create_date')
# -num으로 우선배치한 후, 같은 숫자가 나온다면 만들어진 순서로 우열을 정한다.)
Count를 사용하기 위해선 from django.db.models import Count
가 필요하다.
유의
탬플릿에선 위 속성들을 그대로 사용할 수 있지만, 괄호는 빼주고 기입한다.
데이터 저장하기
객체 저장
객체(모델)를 조회, 조작한 후 모델.save()
를 실행한다.
데이터 삭제
객체 삭제
조회, 조작한 후 모델.delete()
를 실행.
권한관리
로그인
로그인이 있어야 필요한 기능은 다음과 같은 형태로 구현.(함수 앞에 둔다.)
from django.contrib.auth.decorators import login_required #로그인이 있어야 가능함
@login_required(login_url='로그인링크가 어디인지 지정')
def question_create(request):
if request.method == 'POST':#포스트로 요청이 들어온다면... 글을 올리는 기능.
form = QuestionForm(request.POST) #폼을 불러와 내용입력을 받는다.
from django.shortcuts import render
from .models import 모델명#모델을 임포트 한다.
#모델.objects는 객체목록을 받는다는 의미이다.
def index(request):
객체 = self.request.user.id #현재 로그인한 사용자의 아이디를 얻을 수 있다.
클래스형 뷰라면?
함수형 뷰라면 위처럼 데코레이터를 두면 되지만, 클래스형 뷰라면 앞에 상속을 한 번 더 해준다.
from django.contrib.auth.mixins import LoginRequiredMixin
class 클래스형뷰(LoginRequiredMixin, 상속할 뷰)
기타 기능
url 주소 불러오기
url 주소를 불러오는 기능을 넣을 때 하드코딩 해두면 나중에 수정이 일어날 때 또 일일이 바꿔야 하는 경우가 생긴다.
그럴 땐 reverse('앱이름:인덱스', args=('넘길변수',))
형태로 해당하는 url을 추출할 수 있다.
탬플릿에 보낼 땐 render로 처리하기 때문에 잘 쓰진 않는 기능이다.