본문 바로가기
Backend/Django

[Django] Django Model 만들기

by keyhong-DE 2023. 11. 18.

장고 프로젝트 만들기

# 장고 프로젝트 생성
django-admin startproject <project name>

# 장고 앱(프로젝트 하위 단위) 생성
python manage.py startapp book_store

모델 데이터베이스 만들기

우선 가볍게 쓰기 좋은 slqite를 이용하기 위해 최상단 레이어에 db.sqlite3 파일을 수동으로 만들어준다.

db.sqlite3

모듈 작성하기

models.py 정의하기

위에서 app(book_store)을 만들었다면 book_store 디렉터리 안에는 models.py가 있다. 데이터베이스와 연결되어 데이터를 주고 받을 때 데이터 타입에 대한 정의를 미리 약속하는 부분의 모듈이다. 

from django.db import models

# Create your models here.

// models.Model 클래스를 상속
class Book(models.Model):
    title = models.CharField(max_length=50) // 문자의 최대 길이를 정의
    rating = models.IntegerField()
   	// id = models.AutoField() // django가 자동으로 id는 만들어준다.

settings.py에 앱 추가하기

우리는 app을 만들었지만, project 모듈인 settings.py에는 앱을 만들었다고 알려주지 않았다. 다음 migrations 과정을 하려면 django가 app이 생겼다는 것을 인지해야한다. INSTALL_APPS 리스트에 새로 만든 앱 이름을 넣어준다.

settings.py에서 INSTALLED_APPS

makemigrations 수행하기

앱 디렉터리 안에는 migrations 폴더가 있는 데, 처음에는 __init__.py 파일을 제외하고는 비워져 있다. 앞서 models.py를 작성 후 커맨드로 아래와 같은 명령어를 날리면 장고가 migration 파일을 생성해준다. migration라는 것은 작성한 모델 코드(models.py)를 db의 스키마에 적용하는 장고만의 방식이다.

python manage.py makemigrations

makemigrations 커맨드 후 오른쪽 이미지와 같이 initial.py 파일이 생성
initial.py

migration 파일이 생성 되었다면, 이어서 migrate 실행시킨다. 그럼 다음 이미지와 같이 여러 파일을 apply한다. 그런데 makemigrations로 app 디렉터리에서 확인한 initial 파일은 하나(0001_initial.py)인데 및에는 여러 개의 파일을 migrate 한다. 

 

그 이유는 장고 내부적으로 auth, session과 같은 기본 모듈(위 settings.py의 INSTALLED_APP)이 있는 데, 해당 모듈들도 데이터베이스 활용하기 때문이다. 해당 기능들을 사용하지 않는다면 migrate 과정 없이도 에러가 생기지 않았겠지만 중요한 기능들을 사용하지 않을 일은 거의 없다.

python manage.py migrate

커맨드 후 CLI 출력

데이터 저장하기 (save)

django에서 제공하는 shell에서 interactive하게 코드를 작성하려면 아래와 같은 명령어를 친다.

python manage.py shell

 

이후 book_outlet(app)의 model 모듈에서 models.Model 클래스를 상속받은 Book 클래스의 인스턴스를 만들어준다. 이 때 우리가 정의한 클래스 변수들을 넣어 초기화 시켜준다. 그럼 해당 객체에서 models.Model에서 상속받은 save() 함수를 사용 할 수 있는 데, 이는 데이터베이스에 데이터를 저장하는 역할을 한다.

django shell에서 작업하기

 

save() 함수는 db에서 insert 쿼리와 같다. 인스턴스에 있는 변수들을 쿼리로 변환하여 db에서 실행해주는 역할을 한다.

INSERT INTO books ( title, rating)
VALUES ("Harry Potter 1 - The Philosopher's Stone", 5);

 

데이터 가져오기 (get)

반대로 데이터를 가져오려면 인스턴스가 아닌 클래스 이름으로 접근한다. Book 클래스의 object 변수의 all() 함수를 실행하게 되면, 앞서 넣었던 2개의 Book이 QuerySet에 담겨 온다.

Book.objects.all()

그런데 해당 방법으로 객체를 보면 불편한 점이 있다. 실제로 들어있는 데이터의 값을 확인하기 어렵기 때문이다. 이럴 경우 model 클래스에서 파이썬 클래스에서 제공하는 내장 함수인 __str__() 오버라이딩 하여 사용하면 된다.

from django.db import models

# Create your models here.

class Book(models.Model):
    title = models.CharField(max_length=50)
    rating = models.IntegerField()

    def __str__(self):
        return f"{self.title} ({self.rating})"

__str__() 오버라이딩 후 데이터베이스 객체 조회