본문 바로가기
Web Programming/django

[Django] Model

by 테리는당근을좋아해 2020. 6. 19.

MTV패턴에서 M(Model)

즉, 모델은 데이터베이스과 관련이 있는 영역이다.

모델에서 클래스를 생성하면 장고에 내장되어있는 ORM을 통해 테이블의 스키마가 생성된다.

 

목표

1) 블로그에 포스트되는 게시글처럼 게시글을 만들 수 있는 클래스를 생성

2) 데이터를 저장하고 출력

 

Model 내 Class 생성

class Post(models.Model):
    title = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    content = models.TextField()
    
    def __str__(self):
        return self.title

app 디렉토리 내에 models.py에 위와 같이 클래스를 생성

 

객체지향 관점에서 title, pub_data, content라는 클래스 멤버를 생성해주는 것

관계형데이터베이스 관점에서는 title, pub_date, content라는 column을 생성해주는 것

 

이러한 객체지향의 클래스와 관계형테이터베이스의 테이블의 불일치는 ORM이 자동으로 해결해준다.

또한, Django는 기본으로 SQLite를 내장하고 있기 때문에 별도의 데이터베이스 설정없이 데이터베이스를 사용할 수 있다.

 

__str__ 함수는 Django에서 관리자 기능을 제공하는데, 관리자 페이지에서 데이터베이스를 확인할 때, 함수에서 반환하는 속성을 기준으로 

레코드를 확인할 수 있도록 한다.

 

__str__함수처럼 각각의 class 내에는 메소드를 정의할 수 있다.

def summary(self): # 글 줄여서 보여줌
        return self.body[:100]

위와 같이 메소드를 정의해준다면, summary 메소드를 통해 body를 최대 100글자만 출력할 수 있도록 한다.

 

Migration

모델 내에 클래스를 정의해줬다면 migration이 필요한다.

migration은 models.py 내에서 정의한 class를 데이터베이스에 동기화하는 작업이다.

이후에 models.py에서 어떠한 작업이 이루어졌다면 반드시 migration작업을 통해 동기화해주도록 하자

 

$ python manage.py makemigrations

$ python manage.py migrate

 

 

관리자 기능

Django의 장점 중 하나는 관리자 기능이다.

관리자 기능을 통해 데이터베이스를 쉽게 확인하고 삽입/수정/갱신 가능하다.

 

관리자 기능을 사용하기 위해서 먼저 관리자 계정을 생성해야한다.

$ python3 manage.py createsuperuser

 

Model에서 생성한 class를 관리자 페이지의 데이터베이스 내에서 확인하기 위해선 app 디렉토리 내의 admin.py를 수정해야한다.

from django.contrib import admin
from .models import Post

# Register your models here.
admin.site.register(Post)

models.py 파일내의 Post 클래스를 import하고 admin.site.register(클래스명) 메소드를 통해 관리자 페이지에 해당 클래스를 등록해준다.

 

혹시 이전 글을 따라서 했다가 에러가 나는 사람은 app 명을 바꿔서 app을 다시만들어야한다.

app명을 app으로 만들었다가 Django에서 사용하는 키워드와 app명이 겹쳐서 에러가 발생한다.

 

 

관리자 페이지에서 생성한 클래스를 확인할 수 있다.

관리자 페이지는 '도메인 주소/admin'에서 확인할 수 있다.

(로컬 서버에서는 '127.0.0.1:8000/admin' 또는 'localhost:8000/admin')

 

 

관리자 페이지에서 add 버튼을 눌러 아래와 같이 데이터를 저장해보자

 

 

화면에서 저장된 데이터 출력하기

index 화면에 저장된 데이터를 출력해보자

먼저 views.py에서 model에서 데이터를 가져와 template에 전달하는 로직이 필요하다.

def index(request):
    posts = Post.objects.all()
    return render(request, 'index.html', {'posts': posts})

 

models.py 에서 Post 클래스를 import 해준다음

Post 클래스의 인스턴스들을 쿼리셋으로 받아 posts 변수에 저장, 딕셔너리 형태로 return 해준다

 

쿼리셋(QuerySet)이란?

데이버테이스에서 전달받은 테이블의 레코드 목록

 

쿼리셋 메소드

- all() : 모든 데이터를 queryset으로 반환
- filter(조건) : 조건식으로 데이터를 찾음
- exclude(조건) : 조건에 일치 하지 않는 데이터

- order_by(정렬필드) : 지정한 필드를 기준으로 오른차순정렬. 내림차순은 '-'를 붙여줌

 

쿼리셋 메소드는 아래와 같은 방식으로 사용가능하다.

def index(request):
	posts = Post.objects.all()
	posts = Post.objects.filter(조건)	
	posts = Post.objects.exclude(조건)
	posts = Post.objects.order_by(정렬필드)
	return render(request, 'model.html', {'posts':posts})

 

다음은 view에서 던져준 쿼리셋을 template에서 표현하는 방식을 구현해야한다.

index.html에서 views.py에서 전달받은 쿼리셋을 템플릿 변수를 사용해 표현한다.

 

index.html

{% for post in posts %}
    <h1>{{post.title}}</h1>
    <p>{{post.pub_date }}</p>
    <p>{{post.content}}</p>
{% endfor %}

템플릿 테그를 이용해 for문으로 넘겨받은 쿼리셋을 하나씩 뽑아서 출력한다.

views.py에서 전달받은 데이터는 레코드하나가 아닌 레코드의 집합이다. 즉, 레코드가 여러 개 있을 때,

<QuerySet [<Post: 첫번째 글>, <Post: 두번째 글>, <Post: 세번째 글>]>

처럼 나오게 된다.

따라서 반복문을 통해 하나씩 접근해야한다.

쿼리셋에서 하나씩 뽑은 레코드의 속성값에 접근하려면 . 연산자를 사용해 위와 같은 방식으로 접근한다.

 

 

 

 

'Web Programming > django' 카테고리의 다른 글

[Django] CRUD Operation(2)  (0) 2020.06.20
[Django] CRUD Operation(1)  (0) 2020.06.19
[Django] 클라이언트 요청 처리  (2) 2020.06.19
[Django] 프로젝트 생성과 앱 생성  (0) 2020.06.19
[Django] 가상환경 준비  (0) 2020.06.18

댓글