장고의 모델은 각 웹앱 폴더에 기본적으로 생성되는 models.py 모듈 안에 정의한다. models.py 모듈 안에 하나 이상의 모델 클래스를 정의할 수 있으며, 하나의 모델 클래스는 DB에서 하나의 테이블에 해당된다.
모델 클래스 : 어떤 형태의 정보가 다뤄지고 저장될지를 정의한다. 장고 웹앱 내에서 코드로 구현되고 웹앱이 구동되면서 실제 데이터베이스와 연동
DB와 각 테이블 : 실제 정의된 내용이 저장되는 장소. 웹앱과는 독립적인 시스템으로 존재한다. 자바 서버나 노드 서버를 통해서도 각각의 웹앱 프레임워크가 제공하는 방식으로 모델 클래스를 정의해서 DB 서버에 접속해서 데이터를 처리하는 것이 가능
Model : 모델 클래스, 데이터 객체 정의와 그 데이터 (models.py)
Template : 사용자에게 보여지는 인터페이스 화면 (templates/*.html)
View : 데이터를 가져오고 적절하게 가공하여 그 결과를 템플릿에 전달하는 역할 (views.py)
새로운 앱 second를 생성한 후(settings.py에서 second 앱 추가, urls.py 수정), second/models.py에서 Post라는 모델 클래스를 선언한다.
class Post(models.Model):
title = models.CharField(max_length=30)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
모델 클래스의 필드를 정의하는 각각의 클래스 변수는 models.CharField(), models.TextField(), models.DateTimeField() 등의 각 필드 타입에 맞는 Field 클래스 객체를 생성하여 할당한다. 더 많은 모델 필드 레퍼런스
settings.py에 DATABASES 코드를 보면 기본적으로 sqlite3 데이터베이스를 사용하도록 설정되어 있다.
> python manage.py makemigrations
> python manage.py migrate
위 명령어로 모델 클래스를 데이터베이스의 실제 테이블로 생성한다.migrations 폴더에 '0001_initial.py'가 생성되었고, 내가 정의한 Post 모델이 id필드가 포함된 상태로 migrate 되었음을 확인할 수 있다.
장고 쉘을 이용
> python manage.py shell
Post 레코드 하나를 저장
> from second.models import Post
> post = Post.objects.create(title='this is title', content='this is content')
> post.save()
생성된 레코드 확인
> posts = Post.objects.all()
> posts[0].title
-> 'this is title' 출력
레코드를 몇 개 더 추가한다
저장된 데이터를 실제 views.py에서 간단하게 출력해 보자
⬇️ second/views.py
from django.shortcuts import render
from second.models import Post
def list(request):
context = {
'items': Post.objects.all()
}
return render(request, 'second/list.html', context)
⬇️ second/templates/second/list.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Second</title>
</head>
<body>
{% for item in items %}
<div>
<h4>{{ item.title }}</h4>
<p>
{{ item.content }}
</p>
</div>
{% endfor %}
</body>
</html>
⬇️ second/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('list/', views.list, name='list'),
]
서버를 띄운 후 http://127.0.0.1:8000/second/list/ 로 접속하면 save한 레코드가 출력되는 것을 확인할 수 있다.