상세 컨텐츠

본문 제목

Django (3) 투표 앱 만들기 - 1

개발 Recording/Django

by sm-stack 2023. 6. 16. 00:54

본문

이 글은 Django Docs 내 튜토리얼을 정리한 글입니다.

 

투표 앱 만들기

이제 앱을 만들어보자. 앱은 특정 기능을 하는 작은 웹 어플리케이션을 의미하고, 우리가 아까 만들었던 mysite는 앱들이 모인 프로젝트이다.

앞에서 만들었던 mysite의 submodule이 아니라, manage.py와 같은 디렉토리에서 또다른 모듈을 만들 수 있음.

python manage.py startapp polls

위 명령어로 별도의 polls 폴더를 만들 수 있다.

이제 Views 파일을 만들어보자(요청 처리 및 주요 로직이 담긴 파일)

# polls/views.py

from django.http import HttpResponse

# Create your views here.
def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

이를 호출하기 위해서는 urls.py라는 파일이 필요하다.

→ 생성해주자.

# polls/urls.py

from django.urls import path

from . import views

urlpatterns = [
    path("", views.index, name="index"),
]

그런 다음, 이 앱을 프로젝트에서 접근할 수 있게 만들어보자. 그러려면 mysite/urls.py에서 urlpatterns 리스트를 만들어주어야 한다.

# mysite/urls.py

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path("polls/", include("polls.urls")),
    path('admin/', admin.site.urls),
]

위에서 쓰인 include() 함수는 다른 URLconf를 참조하는 것을 허용한다.

이는 plug-and-play URL을 쉽게 하기 위함이다. polls가 urls.py를 가지고 있는 한, 어떤 폴더 내(e.g. /fun_polls/polls/urls.py)에 위치하든 접근할 수 있다!

위에서 쓰인 path() 함수는 네 가지 인수를 받을 수 있다.

  • route : URL 패턴을 담는 string. 아래와 같은 요청이 들어왔을 때?
  • view
    • 일치하는 url 패턴을 찾으면, HttpRequest 객체를 첫 번째 인수로, 경로에서 캡쳐
  • kwargs → 지금은 안 쓸 것.
  • name : url에 이름을 지정해서 보다 명확하게 참조할 때 사용 가능. 특히 Template에서.

 

데이터베이스 셋업

이제 mysite/settings.py로 가보자. 이는 Django 셋팅을 대표하는 모듈 수준의 변수들이 담진 일반적인 파이썬 모듈이다.

기본적으로, SQLite를 사용한다. DB가 처음이라면 가장 쉬운 선택지 중 하나이다. 그러나, 만약 진짜 프로덕션 레벨의 프로젝트를 시작하려면, PostgreSQL과 같은 확장성 높은 DB를 써야 할 것이다.

만약 다른 DB를 쓰고 싶다면, 올바른 database binding을 설치하고 DATABASE ‘default’ 아이템 내 키를 바꾼다.

  • ENGINE  
    • 'django.db.backends.sqlite3''django.db.backends.postgresql''django.db.backends.mysql', 또는 'django.db.backends.oracle'.
    • 다른 백엔드도 가능하다
  • NAME
    • DB의 이름. SQLite를 쓰고 있다면 DB는 컴퓨터 내 파일이 될 것임. 그 경우, NAME 은 파일 이름을 포함하는 절대 경로로 표현된다. 기본값 : BASE_DIR / 'db.sqlite3'

또한 다른 DB를 쓰는 경우 USER, PASSWORD, HOST와 같은 추가 설정이 추가되어야 한다. 자세한 설명은 링크 참조.

SQLite 말고 다른 DB를 쓸 때, DB interactive prompt에서 “CREATE DATABASE database_name”을 사용하여 데이터베이스를 생성한다.

또한 mysite/settings.py에서 “create database” privilege가 있는지 확인해라.

INSTALLED_APPS는 Django 인스턴스에 활성화된 모든 Django 어플리케이션을 나타낸다.

위는 기본적으로 포함되는 앱들이다. 이 앱들은 데이터베이스 테이블을 필요로 하므로, DB에 테이블을 생성해야 한다.

생성 명령:

$ python manage.py migrate

이 명령은 무슨 뜻일까?

→ INSTALLED_APPS의 DB 설정을 확인하고, DB 설정에 따라 필요한 DB 테이블을 생성하며 앱으로부터 DB 마이그레이션을 실시(나중에 더 자세히 다룰 것).

만약 기본 제공된 앱을 빼고 싶다면, 위 명령을 실행하기 전에 settings.py 내 INSTALLED_APPS에서 빼고 싶은 앱 제거.


Model 생성

모델을 정의하려면, DB 레이아웃과 추가 메타데이터가 필요하다.

이에 대한 Django의 철학은 다음과 같음.

  • Model은 데이터에 대한 단일, 결정적 정보 소스로 동작,
  • DRY 원칙을 따름 - Don’t Repeat Yourself의 약자로, 정보의 반복을 줄이는 것을 목표로 함.
  • 한 곳에서 데이터 모델을 정의하고, 자동으로 다른 곳으로 파생시키는 것.
  • 따라서 마이그레이션이 핵심 개념 중 하나. 마이그레이션은 전적으로 Model 파일로부터 나옴.

예시로 만드는 투표 앱에서는 두 가지 모델을 쓸 것:

: Question & Choice

  • Question
    • 질문과 publication 날짜를 담고 있음.
  • Choice
    • 두 가지 필드를 가지고 있음 : 선택에 대한 텍스트 / 투표 집계
    • 각 Choice는 Question 당 하나씩 존재.

이는 파이썬에서 다음과 같이 클래스로 표현된다.

# 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)

Django에서 각 모델은 django.db.models.Model의 하위 클래스로 정의됨. 각 모델은 클래스 변수를 여러 개 가지고 있고, 클래스는 모델 내 데이터베이스 필드를 나타낸다.

각 필드는 Field 클래스의 인스턴스로 나타내어진다

e.g. CharField, DateTimeField, IntergerField, …

이는 각 필드가 어떤 유형의 데이터를 담고 있는지 알려준다.

question, choice_text와 같은 변수 이름 : DB에서 열 이름으로 사용됨.

위에서 Choice가 Question과 연결되어 있다고 했는데, 이는 ForeignKey를 통해 표현됨. Django에서는 이러한 DB 간 관계 표현이 매우 자유로움 - many-to-one / many-to-many / one-to-one

'개발 Recording > Django' 카테고리의 다른 글

Django (2) Major Components  (0) 2023.06.11
Django (1) 기본 개념 및 설치 방법  (0) 2023.06.11

관련글 더보기