장고(django) 모델(models) 사용해보기

2023-03-15 hit count image

장고(django) 프로젝트에서 어플리케이션을 생성하고 새로운 어플리케이션에 필요한 데이터를 저장할 모델(models)을 생성하고 사용하는 방법에 대해서 알아봅니다.

개요

파이썬(python)의 장고(django)로 서버사이드를 개발해보려고 합니다. 이 블로그 포스트에서는 장고(django) 명령어를 새로운 어플리케이션을 생성하고, 그 어플리케이션에서 사용할 데이터를 저장하기 위해 모델(models)를 생성하고 사용하는 방법에 대해서 알아보려고 합니다.

이 블로그는 시리즈로 작성되어 있으며, 아래에 링크를 통해 시리즈의 다른 글을 확인할 수 있습니다.

또한 이 블로그 시리즈에서 다룬 소스는 github에 공개되어 있습니다. 아래에 링크를 통해 확인 가능합니다.

장고(django) 어플리케이션 생성

장고(django)는 큰 단위에 프로젝트가 있고 그 안에 작은 단위로 어플리케이션이 존재합니다. 한 프로젝트에는 여러개의 어플리케이션이 존재할 수 있습니다. 여기에서는 장고(django)로 블로그를 개발한다고 가정하고 진행하도록 하겠습니다. 그럼 본격적으로 장고(django)로 개발하기 위해 아래에 장고(django) 명령어로 blog 어플리케이션을 생성합니다.

# virtualenv venv
# source venv/bin/activate
# pip install -r requirements.txt
# django-admin --version
# 2.2
python manage.py startapp blog

장고(django)의 어플리케이션이 잘 생성되었다면 아래와 같은 폴더 구조를 확인할 수 있습니다.

|-- django_exercise
|   |-- __init__.py
|   |-- settings.py
|   |-- urls.py
|   |-- wsgi.py
|-- blog
|   |-- __init__.py
|   |-- admin.py
|   |-- apps.py
|   |-- models.py
|   |-- tests.py
|   |-- views.py
|-- manage.py

새로 생성된 어플리케이션 하단의 파일들은 아래와 같은 역할을 합니다.

  • admin.py: 장고(django)에서 기본적으로 제공하는 관리화면 설정
  • apps.py: 어플리케이션 메인 파일
  • models.py: 어플리케이션의 모델(models) 파일
  • tests.py: 테스트 파일
  • views.py: 어플리케이션의 뷰(views) 파일

이 밖에도 아래와 같이 장고(django)에서 사용하는 파일들이 있습니다.

  • urls.py: 어플리케이션의 url 관리
  • forms.py: 입력 폼 관리
  • behaviors.py: 모델 믹스인 위치에 대한 옵션
  • constants.py: 어플리케이션 상수 관리
  • decorators.py: 데코레이터 관리
  • factories.py: 테스트 데이터 팩토리 파일
  • helpers.py: 뷰(views)와 모델(models)을 도와주는 함수 관리
  • managers.py: 커스텀 모델 매니저 파일
  • signals.py: 커스텀 시그널 관리
  • viewmixins.py: 뷰(views) 믹스인 관리

뭔 소리인지 하나도 모르겠네요. 나중에 하나씩 공부하다보면 저절로 알게 될테니 그냥 이런 파일이 있다고 생각하고 넘어가면 될거 같습니다.

장고(django) 어플리케이션을 생성하였으니, 장고(django) 프로젝트에 새롭게 생성한 어플리케이션을 등록해야합니다. 장고(django) 프로젝트를 관리하는 django_exercise/settings.py를 열고 아래와 같이 장고(django) 어플리케이션을 등록합니다.

...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog'
]
...

모델(models) 생성하기

이제부터 블로그 사이트를 개발하기 위해 필요한 모델(models)을 생성합니다. blog/models.py를 열고 아래의 내용을 추가합니다.

from django.db import models
from django.utils import timezone

class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    published_at = models.DateTimeField(blank = True, null = True)

    def publish(self):
        self.published_at = timezone.now()
        self.save()

    def __str__(self):
        return self.title

작성한 코드를 자세히 살펴보도록 하겠습니다.

  • Postauthor, title, content, created_at, updated_at, published_at 필드를 가지고 있습니다.
  • authorForeignKey 함수를 사용하여, 장고(django)에서 기본적으로 제공하는 auth 어플리케이션의 User 모델을 참조하게 만들었습니다.(auth.User: 앱이름.모델)
  • title은 블로그의 제목으로 CharField 함수를 사용하여 길이가 정해진 문자열을 저장하도록 하였습니다. max_length 옵션을 사용해 길이가 100인 문자열을 저장하도록 설정하였습니다.
  • content는 블로그의 내용으로 TextField 함수를 통해 길이가 정해져있지 않는 문자열을 저장할 수 있도록 하였습니다
  • created_at은 블로그 생성 날짜로 DateTimeField을 통해 날짜와 시간을 저장할 수 있도록 하였으며, auto_now_add 옵션을 사용하여 데이터 생성시 현재 시간을 저장하도록 하였습니다.
  • updated_at는 블로그 수정일로 역시 DateTimeField을 통해 날짜와 시간을 저장할 수 있도록 하였으며, auto_now 옵션을 사용하여 데이터가 갱신될 때 현재 시간을 저장하도록 하였습니다.
  • published_at는 블로그를 공개한 날짜로 역시 DateTimeField을 통해 날짜와 시간을 저장할 수 있도록 하였습니다.

위에서는 설명하지 않은 blank = True, null = True는 별도로 설명하려고 합니다.

  • blank: 유효성(validation) 처리와 관련이 있는 옵션으로, form.is_valid()를 사용하여 입력폼의 유효성 검사를 할때 사용됩니다. 데이터의 공백(blank)을 허용합니다.
  • null: 데이터베이스와 관련이 있는 옵션으로, 데이터베이스의 null을 저장할 수 있도록 하는 옵션(nullable)

이 모델에는 publish, __str__ 함수를 가지고 있습니다.

  • publish: 블로그 서비스에서 자주 사용되는 기능인 공개(publish) 기능을 함수로 만들었습니다. 이 함수를 통해 블로그를 공개(publish)할 때 날짜를 갱신하기 위해 만들었습니다.
  • __str__: 표준 파이썬 클래스 메소드이며 사람이 읽을 수 있는 문자열을 반환하도록 합니다.

모델(models)을 이용하여 테이블 생성

지금까지 만든 모델(models)을 가지고 데이터베이스(database)의 테이블을 생성하는 방법에 대해서 알아봅니다.

마이그레이션 파일 생성

우선 아래에 장고(django) 명령어로 우리가 만든 모델(models)로부터 데이터베이스(database)의 테이블을 생성하기 위한 마이그레이션(migration) 파일을 생성합니다.

python manage.py makemigrations blog

명령이 제대로 실행되었다면 아래와 같은 결과를 볼 수 있습니다.

장고(django) 모델(models)로부터 마이그레이션 생성

그리고 폴더를 확인하면 마이그레이션 폴더와 파일이 생성된 것을 확인할 수 있습니다.

|-- django_exercise
|   |-- __init__.py
|   |-- settings.py
|   |-- urls.py
|   |-- wsgi.py
|-- blog
|   |-- migrations
|   |   |-- __init__.py
|   |   |-- 0001_initial.py.py
|   |-- __init__.py
|   |-- admin.py
|   |-- apps.py
|   |-- models.py
|   |-- tests.py
|   |-- views.py
|-- manage.py

테이블 생성

아래에 장고(django) 명령어로 모델(models)로부터 생성한 마이그레이션(migration) 파일을 이용하여 데이터베이스의 테이블을 생성합니다.

python manage.py migrate blog

명령어가 잘 실행되면 아래와 같은 결과를 확인할 수 있습니다.

장고(django) 모델(models)로부터 생성한 마이그레이션 파일을 사용하여 데이터베이스 테이블 생성

데이터베이스 툴을 사용하여 데이베이스를 보면 우리가 모델(models)에 설정한 테이블이 생성된 것을 확인할 수 있습니다.

마이그레이션 파일로 생성한 테이블 확인

완료

이것으로 장고(django)에서 모델(models)을 생성하고 생성한 모델(models)을 활용하여 DB 테이블을 생성하는 방법을 알아보았습니다. 이로써 개발에 필요한 정보를 저장할 수 있게 되었습니다. 이제 서비스에 필요한 DB를 설계하고 그에 따른 모델(models)과 마이그레이션(migration)을 생성하여 DB 테이블을 생성해 봅시다!

참고

모델 데이터 타입

아래는 장고(django) 모델에서 사용 가능한 데이터 타입입니다.

Data typeDjango model type
Binarymodels.BinaryField()
Booleanmodels.BooleanField()
Booleanmodels.NullBooleanField()
Date/timemodels.DateField()
Date/timemodels.TimeField()
Date/timemodels.DateTimeField()
Date/timemodels.DurationField()
Numbermodels.AutoField()
Numbermodels.BigIntegerField()
Numbermodels.DecimalField(max_digits=X,decimal_places=Y)
Numbermodels.FloatField()
Numbermodels.IntegerField()
Numbermodels.PositiveIntegerField()
Numbermodels.PositiveSmallIntegerField()
Numberoptions.SmallIntegerField()
Textmodels.CharField(max_length=N)
Textmodels.TextField()
Text (Specialized)models.CommaSeparatedIntegerField(max_length=50)
Text (Specialized)models.EmailField()
Text (Specialized)models.FileField()
Text (Specialized)models.FilePathField()
Text (Specialized)models.ImageField()
Text (Specialized)models.GenericIPAddressField()
Text (Specialized)models.SlugField()
Text (Specialized)models.URLField()
Text (Specialized)models.UUIDField()

제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!

앱 홍보

책 홍보

블로그를 운영하면서 좋은 기회가 생겨 책을 출판하게 되었습니다.

아래 링크를 통해 제가 쓴 책을 구매하실 수 있습니다.
많은 분들에게 도움이 되면 좋겠네요.

스무디 한 잔 마시며 끝내는 React Native, 비제이퍼블릭
스무디 한 잔 마시며 끝내는 리액트 + TDD, 비제이퍼블릭
[심통]현장에서 바로 써먹는 리액트 with 타입스크립트 : 리액트와 스토리북으로 배우는 컴포넌트 주도 개발, 심통
Posts