1. View
(1) 애플리케이션의 제어 흐름 및 처리 로직 정의
(2) views.py에 작성
1) 가독성과 유지보수 편리성, 재활용을 고려하여 작성
2) 함수형 뷰: Function views방법 - request를 매개변수로 받는 함수 정의
3) 클래스형 뷰: Class-based views 방법 - TemplateView클래스를 상속받는 클래스 정의
from django.shortcuts import render
from django.views.generic.base import TemplateView
# Create your views here.
def MainFunc(request): #
return render(request, 'index.html')
class callView(TemplateView): # TemplateView를 상속받은 것
template_name = "callget.html"
4) 일반 메소드
① render(request, '파일명.html’, 전송할 파일)
i. from django.shortcuts import render 로딩
ii. 서버에서 바로 호출 -> urls.py안만남
iii. get/post요청방식 모두 처리
a. get방식만 처리: if request.method == ‘GET’: 조건 사용
b. post방식만 처리: if request.method == ‘POST’: 조건 사용
from django.shortcuts import render
def InsertFunc(request):
#return render(request, 'index.html') #get, post모두 처리
if request.method == 'GET':
print('GET요청')
return render(request, 'insert.html')
elif request.method == 'POST':
print('POST요청')
#넘어오는 값 받기
irum = request.POST.get("name")
# = request.POST["name"]/ get방식으로 값을 받을 때는 POST를 GET으로 바꾸면 됨
return render(request,"list.html", {'name':irum})
else:
print('요청에러')
iv. 파일명.html: 해당 views.py가 포함된 application의 templates폴더에 매핑할 html파일
v. 전송할 파일
a. dict 형으로 입력
b. key값으로 html파일에서 자료 받음
② HttpResponseRedirect('요청명')
i. from django.http.response import HttpResponseRedirect 로딩
ii. Redirect방식
iii. 클라이언트를 통해서 shows호출 -> urls.py 만남
ex) 클라이언트가 링크를 누른 것과 같음
③ HttpResponse(data, content_type)
i. response를 반환하는 함수
ii. from django.http.response import HttpResponse 로딩
<html을 반환>
from django.http.response import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("기본요청 처리")
def hello_func(request):
msg = '장고 만세'
ss = "<html><body>장고 프로젝트 작성 메세지는 %s</body></html>"%msg
return HttpResponse(ss)
<ajax요청 - json형식을 전달>
import json
from django.http.response import HttpResponse
def func2(request):
datas = [
{'irum':'고길동', 'nai':25},
{'irum':'신길동', 'nai':35},
{'irum':'나길동', 'nai':45}
]
return HttpResponse(json.dumps(datas), content_type = 'application/json')
④ request.요청방식.get("name") = request.요청방식[“name”]
i. 요청 시 매개변수 값 받는 메소드
ii. 요청방식: POST/GET (대문자로 입력)
iii. name: 속성 값
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>자료입력</h1>
<form action="/sangpum/insert" method="post">{% csrf_token %}
<!-- csrf해킹방지 - post방식일 때, body로 정보 타고 들어 갈 때 생길 수 있는 해킹 -->
이름: <input type="text" name="name">
<input type="submit" value="등록확인">
</form>
</body>
</html>
<views.py>
from django.shortcuts import render
from django.views.generic.base import TemplateView
# Create your views here.
def MainFunc(request): #
return render(request, 'index.html')
class callView(TemplateView): # TemplateView를 상속받은 것
template_name = "callget.html"
def InsertFunc(request):
#return render(request, 'index.html') #get, post모두 처리
if request.method == 'GET':
print('GET요청')
return render(request, 'insert.html')
elif request.method == 'POST':
print('POST요청')
#넘어오는 값 받기
irum = request.POST.get("name")
# html파일에서 <input type="text" name="name">의 name속성의 값 name을 받음
return render(request,"list.html", {'irum':irum})
else:
print('요청에러')
5) 쿼리셋(QuerySet)
① 전달받은 모델의 객체 목록
② 데이터베이스로부터 데이터를 읽고 필터를 걸거나 정렬 등을 가능
③ 리스트와 구조는 같지만 파이썬 기본 자료구조가 아니기에 읽고 쓰기 위해서는 자료형 변환 필요
④ 쿼리셋은 데이터베이스의 여러 레코드(row)를 나타낸다.
⑤ objects
i. Model Manager
ii. DB와 Django Model 사이의 Query Operation(질의연산)의 인터페이스 역할
iii. objects를 사용해서 다수의 데이터를 갖고 오는 함수를 사용할 때, 반환되는 객체가 QuerySet
ex) Person.objects: objects라는 이름의 manager가 Person 데이터베이스를 QuerySet 형태로 만들겠다는 의미
⑥ 쿼리셋 반환 메소드
⑦ .all()
i. 테이블명.objects.all() = select * from 테이블명
ii. 테이블명.objects.all().order_by(오름차순/-내림차순 기준)
iii. 테이블명.objects.all().order_by(오름차순/-내림차순 기준)[n:m]
: n부터 m-1까지 row 추출
iv. 테이블명.objects.all().aggregate(Avg/Count/Min/Max/Sum(계산대상))
a. select Avg/Count/Min/Max/Sum(계산대상) from 테이블명
b. from django.db.models.aggregates import Avg, Count, Min, Max, Sum 로딩
⑧ .values()
i. 쿼리셋의 내용을 dict type으로 각 객체정보를 갖는 리스트 형태로 반환
ex) Blog.objects.filter(name__startswith='Beatles').values()
☞ <QuerySet [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]>
ii. values()는 인자 값으로 필드이름을 넘겨서 원하는 필드 정보만 dict로 구성할 수도 있다.
ex) Blog.objects.values('id', 'name') ☞ <QuerySet [{'id': 1, 'name': 'Beatles Blog'}]>
iii. ForeignKey로 설정되어 있는 필드에 대해서는 filed, filed_id 둘 다 같은 결과를 반환한다.
ex) Entry.objects.values('blog') ☞ <QuerySet [{'blog': 1}, ...]>
Entry.objects.values('blog_id') ☞ <QuerySet [{'blog_id': 1}, ...]>
iv. 테이블명.objects.values(컬럼명).annotate(그룹함수)
= select 컬럼명, 그룹함수 from 테이블명 GROUP BY 컬럼명
⑩ .filter()
i. 형식: 테이블명.objects.filter(조건) = select * from 테이블명 where 조건
ii. 특정 조건에 맞는 Row들을 갖고 오기 위해서 사용되는 메소드
iii. 괄호안에 lookup parameter(지정된 매개변수)와 일치하는 객체를 포함한 새로운 쿼리셋을 반환
iv. 값이 없을 때 빈 쿼리셋 반환
⑪ .exclude()
i. 특정 조건을 제외한 나머지 Row들을 갖고 오기 위해서 사용되는 메소드
ii. 지정된 parameter(매개변수)와 일치하지 않는 객체를 포함한 QuerySet을 반환
iii. filter()와 반대로 동작
ex1) Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3), headline='Hello')
= SELECT ... WHERE NOT (pub_date > '2005-1-3' AND headline = 'Hello')
: 발행일자가 2005년 1월 3일 이후이면서 headline이 'Hello'인 entry만 제외하고 나머지를 추출
ex2) 두 번 .exclude()를 지정 => OR연산처럼 작동
Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3)).exclude(headline='Hello')
= SELECT ... WHERE NOT pub_date > '2005-1-3' AND NOT headline = 'Hello'
: 발행일자가 2005년 1월 3일 이후이거나 headline이 'Hello'인 모든 항목을 제외하고 추출
⑫ .first()
i. 데이터들 중 처음에 있는 row 만을 반환한다.
ii. QuerySet과 일치하는 첫 객체를 반환
iii. 정렬을 정의하지 않으면 pk로 자동 정렬
iv. order_by() 와 상호작용에 영향
⑬ .last()
i. 데이터들 중 마지막에 있는 row 만을 반환
ii. QuerySet과 일치하는 마지막 객체를 반환
6) 자주사용하는 db관련 메소드
① .get()
i. 하나의 Row만 갖고 오기 위해서 사용되는 메소드
ii. .get()은 쿼리셋이 아니라 모델 객체를 반환하는 메소드
iii. 특정 column 조건에 해당하는 결과를 객체로 반환하는 함수
iv. 쿼리셋을 호출하는 것이 아니라서 뒤에 다른 메소드를 추가할 수 없다.
v. 값이 없을 때 DoesNotExist 메시지 반환
vi. 해당하는 값이 한 개가 아닐 경우에는 MultipleObjectsReturned 메시지 반환
vii. 그러므로 try-except 구문 등으로 예외처리해야 한다.
② .count()
i. 데이터의 개수 (row의 수)를 세기 위해 사용되는 메소드이다.
ii. QuerySet과 일치하는 DB 객체의 수를 나타내는 정수를 반환한다.
iii. .count()는 SELECT COUNT(*) 를 수행하므로, 모든 레코드를 파이썬 객체에 로드하고 len()을 호출하는 것보다는 count()를 사용하는게 더 빠름
iv. 객체를 메모리에 로드 하지 않을 때는 len()이 더 빠름
③ save()
i. 형식: 테이블명(변수 = 값…).save()
ii. 객체를 변수에 저장하고, 해당 변수를 원하는 value에 할당한 뒤 저장하는 방식
iii. insert, update에 사용
④ extra(tables = 리스트타입, select = dict타입, where = 리스트 타입)
i. foreign key가 설정되어 있지 않은 두 테이블을 조인할 때 사용
ii. 형식: 테이블명1.objects.extra(tables = 리스트타입, select = dict타입, where = 리스트 타입)
iii. tables: 조인할 ‘테이블명’을 [ ]안에 명시 = 리스트
iv. select: 조인한 테이블에서 추출할 컬럼명을 dict타입으로 명시
v. where: 두 테이블의 연결 조건
<수정> 수정할 때는 기존에 저장되어 있는 값을 불러오고 다시 그 값에 덮어쓰는 것처럼 수정코드를 짠다.
def UpdateokFunc(request):
if request.method == 'POST':
upRec = Sangdata.objects.get(code=request.POST.get("code"))
upRec.code = request.POST.get("code") #코드를 수정하진 않으니깐 안써도 되긴함
upRec.sang = request.POST.get("sang")
upRec.su = request.POST.get("su")
upRec.dan = request.POST.get("dan")
upRec.save()#수정
<종합 예제>
4. Django 설정 파일 (0) | 2021.05.11 |
---|---|
3. MVT방식 - (3) Template (0) | 2021.05.11 |
3. MVT방식 - (1) Model (0) | 2021.05.11 |
2. 프로젝트 설정 - (4) DB 생성 (0) | 2021.05.11 |
2. 프로젝트 설정 - (3) urls.py (0) | 2021.05.11 |