개요
파이썬(python)의 장고(django)로 서버사이드를 개발해보려고 합니다. 이 블로그 포스트에서는 장고(django) 명령어를 새로운 어플리케이션을 생성하고, 그 어플리케이션에서 사용할 데이터를 저장하기 위해 모델(models)를 생성하고 사용하는 방법에 대해서 알아보려고 합니다.
이 블로그는 시리즈로 작성되어 있으며, 아래에 링크를 통해 시리즈의 다른 글을 확인할 수 있습니다.
- 장고(django) 설치하기
- 장고(django) 프로젝트 시작하기
- 장고(django) 모델(models) 사용해보기
- 장고(django)의 관리자 페이지
- 장고(django)의 라우팅(Routing)
- 장고(django)의 ORM
- 장고(django)의 뷰(View)
- 장고(django)의 폼(Form)
- 장고(django) 프로젝트를 헤로쿠(heroku)에 업로드하기
또한 이 블로그 시리즈에서 다룬 소스는 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
작성한 코드를 자세히 살펴보도록 하겠습니다.
Post
는author, title, content, created_at, updated_at, published_at
필드를 가지고 있습니다.author
는ForeignKey
함수를 사용하여, 장고(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_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
명령어가 잘 실행되면 아래와 같은 결과를 확인할 수 있습니다.
데이터베이스 툴을 사용하여 데이베이스를 보면 우리가 모델(models)에 설정한 테이블이 생성된 것을 확인할 수 있습니다.
완료
이것으로 장고(django)에서 모델(models)을 생성하고 생성한 모델(models)을 활용하여 DB 테이블을 생성하는 방법을 알아보았습니다. 이로써 개발에 필요한 정보를 저장할 수 있게 되었습니다. 이제 서비스에 필요한 DB를 설계하고 그에 따른 모델(models)과 마이그레이션(migration)을 생성하여 DB 테이블을 생성해 봅시다!
참고
모델 데이터 타입
아래는 장고(django) 모델에서 사용 가능한 데이터 타입입니다.
Data type | Django model type |
---|---|
Binary | models.BinaryField() |
Boolean | models.BooleanField() |
Boolean | models.NullBooleanField() |
Date/time | models.DateField() |
Date/time | models.TimeField() |
Date/time | models.DateTimeField() |
Date/time | models.DurationField() |
Number | models.AutoField() |
Number | models.BigIntegerField() |
Number | models.DecimalField(max_digits=X,decimal_places=Y) |
Number | models.FloatField() |
Number | models.IntegerField() |
Number | models.PositiveIntegerField() |
Number | models.PositiveSmallIntegerField() |
Number | options.SmallIntegerField() |
Text | models.CharField(max_length=N) |
Text | models.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() |
제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!
앱 홍보
Deku
가 개발한 앱을 한번 사용해보세요.Deku
가 개발한 앱은 Flutter로 개발되었습니다.관심있으신 분들은 앱을 다운로드하여 사용해 주시면 정말 감사하겠습니다.