장고:view 각종 기능
편집하기
Sam
(
토론
|
기여
)
님의 2020년 12월 28일 (월) 11:28 판
(
→범위 지정
)
(
차이
)
← 이전 판
|
최신판
(
차이
) |
다음 판 →
(
차이
)
둘러보기로 이동
검색으로 이동
경고: 이 문서의 오래된 판을 편집하고 있습니다.
이것을 게시하면, 이 판 이후로 바뀐 모든 편집이 사라집니다.
경고:
로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다.
로그인
하거나
계정을 생성하면
편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.
스팸 방지 검사입니다. 이것을 입력하지
마세요
!
{{장고}} =데이터 다루기= ==데이터 불러오기== ===모델의 pk 얻기=== 모델명.id 가 pk이다.<br /> ===객체 조회=== 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=기본키값) #서버에러가 나지 않게끔. </syntaxhighlight><br /> ===목록 조회=== <syntaxhighlight lang="python"> from django.shortcuts import render from .models import 모델명#모델을 임포트 한다. #모델.objects는 객체목록을 받는다는 의미이다. def index(request): 목록 = 모델.objects.order_by('-create_date') #create_date속성의 역순으로 정리하라는 의미. context={'템플릿에서 쓸 변수명':목록) return render(request, '템플릿', context) </syntaxhighlight> ===객체 다 가져오기=== <syntaxhighlight lang="python"> from django.shortcuts import render from .models import 모델명#모델을 임포트 한다. #모델.objects는 객체목록을 받는다는 의미이다. def index(request): 목록 = 모델.objects.all </syntaxhighlight>모델.objects.all[:5] 처럼 상위 5개만 가져오는 방식도 가능. ==필터 사용== ===필터로 걸러서 가져오기=== <syntaxhighlight lang="python"> from django.shortcuts import render from .models import 모델명#모델을 임포트 한다. #모델.objects는 객체목록을 받는다는 의미이다. def index(request): 목록 = 모델.objects.filter(칼럼명 = True, >0 따위의 조건들...) 목록2= 목록.objects.filter(조건들..)#객체에 또다시 필터를 걸 수도 있다. </syntaxhighlight>필터는 몇번이라도 걸 수 있는데, 장고는 지연평가 방식을 사용하기 때문에 실제로 데이터를 질의하는 것은 한 번 뿐이다. 덕분에 부하가 걸리지 않고도 filter를 자유롭게 사용할 수 있다.<syntaxhighlight lang="python"> def index(request): 목록 = 모델.objects.filter(칼럼명 = True, >0 따위의 조건들...) .filter(조건) .filter(조건2) </syntaxhighlight>filter에서 각종 연산자를 사용할 땐 '__'를 붙인다.<syntaxhighlight lang="python"> def index(request): 목록 = 모델.objects.filter(속성__startswith='시작할단어') </syntaxhighlight> ===범위 지정=== 필터 안에서 > 따위의 기호는 사용할 수 없다. 대신 __을 사용해 명령을 지정한다. {| class="wikitable" |+ !기능 !설명 |- |gt |greater than |- |gte |greater than or equal to |- |lt |less than |- |lte |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"> time = request.GET.get('start').split('-') date = datetime(int(time[0]), int(time[1]), int(time[2])) date = datetime.date(date) </syntaxhighlight> ===제외하기=== 필터로 원하는 조건을 받아들이는 것과 반대로, 조건에 따라 제외하는 것도 가능하다. 필터와 동일하게 중첩으로 걸 수 있다.<syntaxhighlight lang="python"> from django.shortcuts import render from .models import 모델명#모델을 임포트 한다. def index(request): 목록 = 모델.objects.exclude(칼럼명 = True, >0 따위의 조건들...) </syntaxhighlight> ===삭제하기=== 해당 객체를 불러온 후 delete()를 붙여준다.<syntaxhighlight lang="python"> def index(request): 목록 = 모델.objects.exclude(칼럼명 = True, >0 따위의 조건들...).delete() #조건을 제외한 것들을 삭제한다. </syntaxhighlight> ===특정단어 검색=== 속성에 특정 단어가 포함된 객체를 불러올 땐 다음과 같이 한다. <code>모델.objects.filter(속성__contains='장고')</code> (언더바가 2개임에 유의) ===객체의 속성에 접근=== 모델.속성 형태로 속성에 접근 가능하다. 일반적으로 <code>객체 = 모델.objects.get(id=pk)</code> 객체.속성 형태로 접근한다.(수정을 하고 반드시 저장을 해주어야 한다.) ===외래키 연결=== 모델에서 외래키로 1:N 연결을 한 경우. 외래키가 연결된 모델의 경우, 외래키 필드에 해당 키의 아이디(pk)를 넣어주면 된다. ex) answer(question=질문키, 기타등등 필드 채우기) 이후 answer.save()를 하면 해당 질문에 대한 답변이 저장된다. answer.question 을 사용하면 어느 질문에 달린 것인지, 질문의 id를 얻어올 수 있다. 하위에서 상위모델로 갈 땐 <code>모델.상위모델</code> 형태로 접근. 하위모델에서 자신과 연결된 상위모델을 조회할 수 있다. 상위에서 하위모델로 갈 땐 <code>모델.하위모델_set</code> 형태로 접근.(_set은 아래로 간다는 방향을 지정해주기 위한 기능인듯) ====DB에 접근하는 경우==== DB의 칼럼에 접근하여 뽑아내는 경우, 상위모델을 뽑아낼 땐 '상위모델__속성명' 형태로 접근할 수 있다.(모두 소문자로) ===질문에서 답변 뽑아내기=== 반대로 질문에서 여러 답변들이 어떤 게 달렸는지 추출할 수도 있다. 모델.연결모델_set.all() 를 실행하면 모델에 foreign키로 연결모델들 객체를 얻을 수 있다. 모델.연결모델_set.count() 는 몇 개가 있는지 세어주고. 이처럼 속성을 가져오는 것은 탬플릿에서도 사용이 가능하다. ====잘 안될 때==== 굳이 또 다른 모델을 임포트 할 필요는 없다.(연결된 모델이 다른 앱에 있다 하더라도) *유의할 점. 연결모델의 이름은 대문자가 들어갔다 하더라도 전부 소문자로 바꾸어 가져와야 한다. *혹시 related_name속성이 지정되어 있다면... 연결모델_set 형태가 안된다면, <code>모델.related_name.all()</code> 형태로 가져오기도 한다. ====related_name(역조회)==== 기본적으로 모델명_set으로 역조회를 할 수 있지만 이는 기본옵션이고, 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> 가 필요하다. <br /> ==유의== 탬플릿에선 위 속성들을 그대로 사용할 수 있지만, 괄호는 빼주고 기입한다. ==데이터 저장하기== ===객체 저장=== 객체(모델)를 조회, 조작한 후 모델<code>.save()</code>를 실행한다. ==데이터 삭제== ===객체 삭제=== 조회, 조작한 후 <code>모델.delete()</code>를 실행. ==권한관리== ===로그인=== 로그인이 있어야 필요한 기능은 다음과 같은 형태로 구현.(함수 앞에 둔다.)<syntaxhighlight lang="python"> from django.contrib.auth.decorators import login_required #로그인이 있어야 가능함 @login_required(login_url='로그인링크가 어디인지 지정') def question_create(request): if request.method == 'POST':#포스트로 요청이 들어온다면... 글을 올리는 기능. form = QuestionForm(request.POST) #폼을 불러와 내용입력을 받는다. </syntaxhighlight><syntaxhighlight lang="python"> from django.shortcuts import render from .models import 모델명#모델을 임포트 한다. #모델.objects는 객체목록을 받는다는 의미이다. def index(request): 객체 = self.request.user.id #현재 로그인한 사용자의 아이디를 얻을 수 있다. </syntaxhighlight> ====클래스형 뷰라면?==== 함수형 뷰라면 위처럼 데코레이터를 두면 되지만, 클래스형 뷰라면 앞에 상속을 한 번 더 해준다.<syntaxhighlight lang="python"> from django.contrib.auth.mixins import LoginRequiredMixin class 클래스형뷰(LoginRequiredMixin, 상속할 뷰) </syntaxhighlight> ==기타 기능== ===url 주소 불러오기=== url 주소를 불러오는 기능을 넣을 때 하드코딩 해두면 나중에 수정이 일어날 때 또 일일이 바꿔야 하는 경우가 생긴다. 그럴 땐 <code>reverse('앱이름:인덱스', args=('넘길변수',))</code> 형태로 해당하는 url을 추출할 수 있다. 탬플릿에 보낼 땐 render로 처리하기 때문에 잘 쓰진 않는 기능이다.
요약:
학교의 모든 지식. SMwiki에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는
학교의 모든 지식. SMwiki:저작권
문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.
저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소
편집 도움말
(새 창에서 열림)
이 문서에서 사용한 틀:
틀:장고
(
원본 보기
) (보호됨)
둘러보기 메뉴
개인 도구
로그인하지 않음
토론
기여
로그인
이름공간
문서
토론
한국어
보기
읽기
편집
원본 편집
역사 보기
더 보기
검색
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
도구
여기를 가리키는 문서
가리키는 글의 최근 바뀜
특수 문서 목록
문서 정보