Model을 활용해 DB 관리하기
데이터베이스란? 데이터를 저장하는 시스템. 특히, 구조화한다는 특징이 있다. 단순히 정보를 저장한다는 창고의 개념이 아니라 쉽게 정보를 탐색할 수 있게 정렬해두어 유저가 정보를 참조하고 싶을 때 바로 참조할 수 있는 시스템이다.
- Relational DB : 테이블 형태. row와 column으로 데이터를 관리하는 것.
- 데이터베이스 인터페이스 프로그래밍 언어 = SQL
- Django에는 ORM이 내장되어 있다.
models.py
class <모델 이름>(models.Model):
# field1 = models.FieldType()...
"""
문자열 : CharField
숫자 : IntegerField, SmallIntegerField, ...
논리형 : BooleanField
시간 / 날짜 : DateTimeField
"""
admin.py
from .models import <모델 이름>
admin.site.register(<모델 이름>)
다음과 같이 admin.py에 생성한 모델을 등록하여 주면
다음과 같이 관리자 홈페이지에서 모델을 관리할 수 있게 된다. 그러나 Coffee(<모델 이름>) 테이블을 눌러보면
그림 출처 : 프로그래머스 스쿨
아직은 반영이 되지 않은 것을 확인할 수 있다. 이를 반영시켜주기 위해선 migrate을 해주어야 한다.
장고에서는 데이터베이스를 관리할 때 모델을 git의 commit과 유사한 migration이란 단위로 관리하게 된다.
cmd에서 migrate를 진행해보도록 하자.
'''git add와 유사'''
> python manage.py makemigrations homepage
'''result'''
Migrations for 'homepage':
homepage\migrations\0001_initial.py
- Create model <모델 이름>
'''만들어진 migration들을 실제 DB에 반영'''
>python manage.py migrate
'''result'''
Operations to perform:
Apply all migrations: admin, auth, contenttypes, homepage, sessions
Running migrations:
Applying homepage.0001_initial... OK
위 작업 이후 다시 admin 사이트의 Coffee 테이블을 눌러서 확인하면
다음과 같이 정상적으로 페이지가 참조되는 것을 확인할 수 있다.
위 페이지에서 Object를 추가하면 다음과 같이 나타나게 된다.
<모델 이름> obejct(1),
<모델 이름> obejct(2), ...
굉장히 가독성이 떨어지는 이름으로 생성이 되게 된다.
무슨 Object를 지칭하는지 한 번에 알 수 있는 좋은 이름으로 각 Object가 생성되도록 하기 위해 코드를 수정해보도록 하자.
models.py
class <모델 이름>(models.Model):
def __str__(self):
return self.<객체를 대표하는 파라미터>
다음과 같이 설정을 해주고 다시 admin 사이트로 가서 확인을 하면
다음과 같이 각 객체를 잘 나타내어 주는 것을 확인할 수 있다.
Template에서 Model 확인하기
views.py
from .models import Coffee
def coffee_view(request):
coffee_all = Coffee.objects.all() #select * from Coffee랑 동일한 결과를 갖고 옴
return render(request, 'coffee.html',{"coffee_list":coffee_all})
coffee.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Coffee List</title>
</head>
<body>
<h1>My Coffe List</h1>
<p>{{coffee_list}}</p>
</body>
</html>
url을 지정 후 coffee.html을 확인해보면 다음과 같은 결과를 얻을 수 있다.
QuerySet이 반환된 것을 확인할 수 있었다.
이번엔 각 요소들 하나하나를 순회하며 그에 대한 Field를 다 살펴보고자 한다.
coffee.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Coffee List</title>
</head>
<body>
<h1>My Coffe List</h1>
{% for coffee in coffee_list %}
<p>{{coffee.name}}, {{coffee.price}}</p>
{% endfor %}
</body>
</html>
실행 결과
Form으로 Template에서 Model 수정하기
forms.py
from django import forms
from .models import Coffee
class CoffeeForm(forms.ModelForm): # ModelForm을 상속받는 CoffeeForm 생성
class Meta: #form을 만들기 위해 어떤 model을 써야 하는지 지정하게 됨
model = Coffee
fields = ('name', 'price', 'is_ice')
views.py
from .forms import CoffeeForm
def coffee_view(request):
coffee_all = Coffee.objects.all()
form = CoffeeForm() #Form 객체 생성
return render(request, 'coffee.html',{"coffee_list":coffee_all,"coffee_form":form})
coffee.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Coffee List</title>
</head>
<body>
<h1>My Coffe List</h1>
{% for coffee in coffee_list %}
<p>{{coffee.name}}, {{coffee.price}}</p>
{% endfor %}
<form>
{{ coffee_form.as_p }}
</form>
</body>
</html>
실행 결과
Form이 생성된 모습을 확인할 수 있다. Form에 대한 틀은 생성이 되었는데 이 form에 정보를 입력 후 서버로 전송하는 버튼이 있어야 한다. 그 버튼도 만들어 보도록 하겠다.
coffee.html
<form method="POST">
{{ coffee_form.as_p }}
<button type="submit">Save</button>
</form>
실행 결과
실제로 Save 버튼이 생긴 것을 확인할 수 있다.
그래서 Save를 하기 위해 버튼을 누르면
다음과 같이 403 에러 메시지를 표시하는 사이트가 뜨는 것을 확인할 수 있다.
왜 이런 에러가 떴냐하면
Form의 옵션에는 보안 옵션이 들어가야 한다.
Djagno에 CSRF를 구현하지 않으면 403 오류가 발생하게 된다. 즉, 서버 입장에서 CSRF 토큰을 Form 안에 삽입해 주어야 한다는 것이다. 토큰을 삽입해 주려면 다음과 같이 한 줄의 코드만 입력해주면 된다.
coffee.html
<form method="POST">{% csrf_token %}
{{ coffee_form.as_p }}
<button type="submit">Save</button>
</form>
form 태그 사이에 오직 {% csrf_token %}만 추가해주면 된다. 이를 추가해준 후에 Save 버튼을 누르면 아까와 같은 에러 사이트는 안 뜨고 정보가 전달이 된 것을 확인할 수 있다. 그러나 전달된 정보는 DB에 들어가지 않게 된다. 왜냐하면 view에서 POST 요청이 들어왔을 때 어떤 logic을 행해야 하는지에 대한 정보를 담지 않았기 때문이다.
view에서 POST 요청이 들어왔을 때 모델에 정보를 담아주는 logic을 구현해 보도록 하자.
views.py
def coffee_view(request):
coffee_all = Coffee.objects.all()
# 만약 request가 POST라면:
# POST를 바탕으로 Form을 완성하고
# Form이 유효하면 -> 저장!
if request.method=='POST':
form = CoffeeForm(request.POST) # 완성된 Form
if form.is_valid(): # 채워진 Form이 유효하다면:
form.save() # 이 Form의 내용을 Model에 저장!
form = CoffeeForm()
return render(request, 'coffee.html',{"coffee_list":coffee_all,"coffee_form":form})
실행 결과
다음과 같이 Form에 입력한 정보가 테이블에 바로 반영되는 것을 확인할 수 있다.
'AI > KDT 인공지능' 카테고리의 다른 글
오토인코더, t-SNE (0) | 2021.06.14 |
---|---|
[06/02] End to End Machine Learning Project (0) | 2021.06.02 |
[05/17] Web Application with Django (0) | 2021.05.17 |
[05/12] EDA mini project (0) | 2021.05.12 |
[05/12] 데이터 씹고 뜯고 맛보고 즐기기 - EDA (0) | 2021.05.11 |