https://docs.djangoproject.com/ko/5.1/intro/tutorial02/
1. 데이터베이스 설치
프로젝트 디렉토리 mysite/setting.py 파일을 열어보면 일반적인 Python 파일로 Django의 모든 설정들이 Python 변수들로 저장되어 있는 것을 확인하실 수 있습니다.
# settings.py
DEBUG = True
INSTALLED_APPS = [
'django.contrib.admin',
'polls',
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'db.sqlite3',
}
}
mysite/settings.py를 편집할 때 현지 시간에 맞춰 TIME_ZONE 값을 설정합니다.
# settings.py
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'Asia/Seoul' # 한국 시간 적용
USE_I18N = True
USE_L10N = True
USE_TZ = False # False 로 설정해야 DB에 변경 된 TIME_ZONE 이 반영 됨
💡USE_TZ 기본 값은 True로 되어 있는데, False로 변경하는 이유는 models의 datetime 필드에도 변경된 TIME_ZONE 값을 적용 시키기 위함입니다.
INSTALLED_APPS는 기본적으로 Django에 내장되어 있는 앱들이 정의되어 있습니다.
# settings.py
INSTALLED_APPS = [
"django.contrib.admin", # Django 관리용 사이트
"django.contrib.auth", # 인증 시스템
"django.contrib.contenttypes", # 컨텐츠 타입을 위한 프레임워크
"django.contrib.sessions", #세션 프레임워크
"django.contrib.messages", # 메세징 프레임워크
"django.contrib.staticfiles", # 정적 파일을 관리하는 프레임워크
]
INSTALLED_APPS에 기본 어플리케이션들 중에 몇몇은 최소한 하나 이상의 데이터베이스 테이블을 사용하는데, 그러기 위해서 데이터베이스 테이블을 미리 만들어줄 필요가 있습니다. 이 명령어를 실행하지 않으면 no such table에러가 발생하게 됩니다.
터미널에서 아래 명령어를 실행하여 테이블을 생성합니다.
$ python manage.py migarate
💡해당 명령어는 INSTALLED_APP에 등록된 각 앱들을 확인하고 settings.py의 migrations 파일들을 참고해서 필요한 데이터베이스 테이블을 실제로 만드는 작업을 수행합니다.
2. 모델 만들기
설문 조사 앱에서 Question, Choice 두 가지 모델을 만들어 보겠습니다.
Question에는 질문과 발행일을 위한 두 개의 필드를,
Choice는 선택 텍스트와 투표 집계를 위한 두 개의 필드를 가집니다.
2.1 ORM
이러한 모델 개념은 Python 클래스로 표현합니다.
모델(Model)은 Django와 데이터베이스를 연결시켜주는 코드이며 일반적으로 각각의 모델은 데이터베이스 테이블과 맵핑됩니다.
- 클래스를 사용하는 이유는 데이터베이스 테이블을 Python객체로 표현합니다. (ORM 핵심 특징)
- 파이썬 클래스를 사용하고 모든 모델 클래스는 django.db.models.Model 클래스를 상속받습니다.
- 데이터를 쉽게 생성,수정,삭제할 수 있습니다.
- Django ORM을 통해 SQL없이도 데이터베이스 조작이 가능합니다.
💡ORM은 데이터베이스의 테이블을 Python 클래스로 테이블 행을 객체로 컬럼을 클래스 속성으로 매핑합니다. 이것으로 SQL대신 Python 코드로 데이터베이스를 다룰 수 있게 됩니다.
데이터베이스 Python 코드의 관계를 예시로 설명하자면,
기존 SQL 방식 DB 테이블 정의는
CREATE TABLE Question (
id INT,
question_text VARCHAR(200),
pub_date DATETIME
);
ORM에선 Python 클래스에 정의합니다.
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField()
테이블 행(ROW)은 Python 객체로 정의합니다.
question = Question(
question_text = "좋아하는 색깔은?",
pub_date = datetime.now()
)
이렇게 ORM 데이터베이스 구조를 Python 코드로 자연스럽게 변환해줍니다.
자, 이제 다시 Question, Choice 테이블을 정의 해보도록 하겠습니다.
polls/models.py 파일을 아래와 같이 정의합니다.
# polls/models.py
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField("date published")
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
Question, Choice는 Django Model 클래스를 상속받아 DB 테이블 구조를 정의합니다.
Django에서 models.Model은 모든 데이터베이스 모델의 기본이 되는 클래스로 아래와 같이 기본적인 기능들을 자동으로 사용 가능합니다.
- 데이터베이스 연결
- CRUD(생성, 읽기, 수정, 삭제) 기능
- 데이터베이스 쿼리 기능
2.2 Field 클래스
모델에 적합한 변수(필드)를 정의합니다.
question_text 필드에서 정의된 models.CharField(max_length=200)와 같은 데이터 타입들은 데이터베이스 컬럼의 타입과 제약 조건을 지정합니다.
models.CharField는 django.db 에서 import한 models 모듈 안에 별도로 정의된 클래스입니다.
💡CharField, DateTimeField 클래스는 Field 클래스를 상속받은 자식 클래스이지만, 모두 models 모듈 안에 있어 모듈 전체 임포트를 하였을 때 models.클래스명으로로 접근합니다.
이렇게 정의된 필드명은 python 코드에서 객체 속성으로 사용할 수 있으며, DB에서 해당 필드 이름 그대로 데이터베이스 컬럼명으로 사용할 수 있습니다.
💡Field 클래스 생성자에서 첫 번째 인수로 전달되는 값은 인간이 읽기 좋은 텍스트 형태로 표시될 이름입니다. 이 값은 필드 이름을 좀 더 직관적으로 보여줄 필요가 있을 때 사용되며 Django가 해당 필드를 UI(Django 어드민페이지/ Django Form/ 에러 메세지 표기)에서 표현할 때 지정한 텍스트로 표시되게 합니다.
몇몇 Field 클래스들은 "필수 인수"가 필요합니다.
예를 들어 CharField의 경우 max_length를 입력해 주어야합니다. 이것은 데이터 스키마에서만 필요한 것이 아니라 값을 검증할때도 쓰이는 요소입니다.
아래와 같이 pub_date의 첫번째 인자에 'date published'라고 정의하였을때
# polls/models.py
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
admin.py Django 어드민 페이지에 Question 모델에 필드 구조를 명시하고 싶다면 클래스를 생성하여 admin.ModelAdmin을 상속 받아 'list_display'에 필드명을 전달 해주어, admin.site.register에 해당 모델과 모델에 대한 관리자 설정을 담은 클래스를 등록합니다.
# admin.py
from django.contrib import admin
from .models import Question
class QuestionAdmin(admin.ModelAdmin):
list_display = ('question_text', 'pub_date') # 리스트에서 표시할 필드 지정
admin.site.register(Question, QuestionAdmin) # 커스터마이징 설정으로 등록
소스코드를 저장 후, 장고 어드민 페이지에서 Questions 모델을 확인 해보면 pub_date에 지정한 라벨이 적용된 것을 확인하실 수 있습니다.
2.3 model 클래스의 __str__ 메서드
__str__ 함수는 장고 모델에서 객체를 인간이 읽기 좋은 '문자열' 형태로 표현하기 위해서 사용되는 메서드입니다.
Python의 기본 메서드로 객체를 문자열로 변환할 때 호출되며 장고에서는 특히 관리자 페이지나, 셀에서 모델 인스턴스 출력할 때 __str__메서드를 사용해 객체를 설명합니다.
Question 모델에서 __str__ 메서드는 아래와 같이 정의되어 있습니다.
# polls/models.py
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
이렇게 정의하면 Question 객체가 "문자열"로 변환할 때 question_text 필드 내용으로 반환합니다.
즉, Question 모델의 인스턴스를 출력할 때 question_text 필드 값이 출력됩니다.
q = Question(question_text="What's new?", pub_date="2023-01-01")
print(q) # 출력: What's new?
__str__메서드가 사용되는 케이스는 주로 아래와 같습니다.
- Django 관리자 어드민 페이지
- 디버깅 및 Django shell
- print() 함수
3. 모델 활성화
앱을 현재 프로젝트에 포함 시키기 위해서는, 앱의 구성 클래스에 대한 참조를 INSTALLD_APPS 설정에 추가해야 합니다.
PollConfig 클래스는 polls/app.py 파일 내에 존재합니다.
따라서 .으로 구분된 경로는 'polls.apps.PollsConfig'가 됩니다.
mysite/setting.py 파일내 INSTALLED_APPS 설정에 해당 경로를 추가해주시면 됩니다.
INSTALLED_APPS = [
"polls.apps.PollsConfig",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
]
이제 polls 앱을 포함하였으니, 터미널에 아래 명령어로 새로 생성된 모델, 혹은 변경된 모델을 migration으로 저장 시키는 것을 django에게 알려줍니다.
$ python manage.py makemigrations polls
그리고 migrate 명령어로 데이터베이스에 모델과 관련된 테이블을 생성합니다.
$ python manage.py migrate
migrate 명령은 아직 적용되지 않은 마이그레이션을 모두 수집해 실행합니다. 변경 사항들과 데이터베이스 스키마 동기화 작업입니다.
데이터베이스를 업데이트 하실 때 아래 3가지 단계를 기억하시면 편할 것 같습니다.
- (models.py 에서) 모델을 변경합니다.
- python manage.py makemigrations을 통해 이 변경사항에 대한 마이그레이션을 만드세요.
- python manage.py migrate 명령을 통해 변경사항을 데이터베이스에 적용하세요.
4. Django 어드민
관리자 사이트에 로그인 할 수 있는 사용자를 생성합니다.
$ python manage.py createsuperuser
username, email adress (이메일 생략하고 싶을 때는 그냥 엔터를 치시면 됩니다), password 입력으로 계정이 완료됩니다.
runserver로 서버를 실행하고, 로컬 도메인에 '/admin/'으로 url 이동하면 어드민 페이지를 확인하실 수 있습니다.
$ python manage.py runserver
part 3에서 계속..
'Programming👩🏻💻 > Web framework' 카테고리의 다른 글
[Django] 공식문서로 익혀보기 part4.2 - 함수/클래스뷰, 제네릭뷰 (1) | 2024.11.30 |
---|---|
[Django] 공식문서로 익혀보기 part4.1 - 폼(Form) 작성하기 (1) | 2024.11.24 |
[Django] 공식문서로 익혀보기 part3 - views 작성 (2) | 2024.11.19 |
[Django] 공식문서로 익혀보기 part1 - 첫 시작, 프로젝트와 앱 만들기 (5) | 2024.11.15 |
Django - URL 패턴 name 속성 (0) | 2024.08.09 |