[Django] #4.Django 모델

Lynn·2021년 1월 7일
1

Django

목록 보기
5/7
post-thumbnail

모델 개요

장고의 모델은 각 웹앱 폴더에 기본적으로 생성되는 models.py 모듈 안에 정의한다. models.py 모듈 안에 하나 이상의 모델 클래스를 정의할 수 있으며, 하나의 모델 클래스는 DB에서 하나의 테이블에 해당된다.

모델 클래스 : 어떤 형태의 정보가 다뤄지고 저장될지를 정의한다. 장고 웹앱 내에서 코드로 구현되고 웹앱이 구동되면서 실제 데이터베이스와 연동

DB와 각 테이블 : 실제 정의된 내용이 저장되는 장소. 웹앱과는 독립적인 시스템으로 존재한다. 자바 서버나 노드 서버를 통해서도 각각의 웹앱 프레임워크가 제공하는 방식으로 모델 클래스를 정의해서 DB 서버에 접속해서 데이터를 처리하는 것이 가능


MTV 패턴

Model : 모델 클래스, 데이터 객체 정의와 그 데이터 (models.py)
Template : 사용자에게 보여지는 인터페이스 화면 (templates/*.html)
View : 데이터를 가져오고 적절하게 가공하여 그 결과를 템플릿에 전달하는 역할 (views.py)

  • http 요청과 응답의 흐름

모델 클래스 선언

새로운 앱 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한 레코드가 출력되는 것을 확인할 수 있다.

profile
wanderlust

0개의 댓글