본문 바로가기
파이썬/장고(django)

[Django] 튜토리얼2. 모델과 어드민 사이트(Models and the admin site)

by 책 읽는 개발자_테드 2022. 6. 12.
반응형

 

 

 이 글은 장고 공식 홈페이지의 튜토리얼을 번역하고, 직접 실습하는 과정을 정리합니다.

첫 번째 튜토리얼(https://scshim.tistory.com/592)과 이어지는 두 번째 글입니다.

 

목차

· 데이터베이스 설정하기

· 모델 생성하기

· 모델 활성화하기

· API 사용하기

· 장고 어드민


해당 튜토리얼에서는 기본 설문 조사 응용 프로그램을 만드는 과정을 통해 학습을 진행한다. 해당 튜토리얼은 Python 3.8 이상을 지원하는 Django 4.0을 사용하여 작성되었다. 아래 명령어를 통해 Django 버전을 확인할 수 있다.

$ python -m django --version

 

데이터베이스 설정하기


mysite/settings.py 파일을 연다. 이것은 장고 설정을 나타내는 모듈 수준 변수가 있는 파이썬 모듈이다.

 

기본적으로 구성은 SQLite를 사용한다. SQLite는 파이썬에 포함되어 있으므로 데이터베이스를 지원하기 위해 다른 것을 설치할 필요가 없다. 다른 데이터베이스를 사용하려면 적절한 데이터베이스 바인딩을 설치하고, 데이터베이스 연결 설정과 일치하도록 DATABASES default 항목에서 다음 키를 변경한다.

 

ENGINE 'django.db.backends.sqlite3', 
'django.db.backends.postgresql', 
'django.db.backends.mysql',
'django.db.backends.oracle'등
NAME 데이터베이스의 이름을 의미한다. SQLite를 사용하는 경우 데이터베이스는 컴퓨터의 파일이 된다. 이 경우 NAME은 파일이름을 포함한 해당 파일의 전체 절대 경로여야 한다. 기본값인 BASE_DIR/'db.sqlite3'은 프로젝트 디렉터리에 파일을 저장한다.

 

SQLite를 데이터베이스로 사용하지 않는 경우 USER, PASSWORD, HOST 같은 설정을 추가해야한다. 

 

※ 주의!

· SQLite 이외의 데이터베이스를 사용하는 경우 데이터베이스 명령 프롬프트에서 "CREATE DATABASE database_name" 으로 데이터베이스를 생성했는지 확인해야한다.

· mysite/settings.py에 제공된 데이터베이스 사용자에게 데이터베이스 생성 권한이 있는지도 확인해야한다.

· SQLite를 사용하면 미리 생성할 필요가 없다. 필요할 때 데이터베이스 파일이 자동으로 생성한다.

 

mysite/settings.py를 편집하는 동안 TIME_ZONE을 시간대로 설정한다. 그리고 파일 상단의 INSTALLED_APPS 설정을 확인한다.

 

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

 

해당 설정은 장고 인스턴스에서 활성화된 모든 장고 애플리케이션의 이름을 보유한다. 앱은 여러 프로젝트에서 사용할 수 있으며 프로젝트에서 다른 사람이 사용할 수 있도록 패키지 및 배포할 수 있다.

 

기본적으로 INSTALLED_APPS에는 장고와 함께 제공되는 다음 앱이 포함되어 있다.

django.contrib.admin 관리자 사이트
django.contrib.auth 인증 시스템
django.contrib.contenttypes 컨텐츠 타입에 대한 프레임워크
django.contrib.sessions 세션 프레임워크
django.contrib.messages 메시징 프레임워크
django.contrib.staticfiles 정적 파일을 관리하기 위한 프레임워크

 

이러한 애플리케이션은 일반적인 경우의 편의를 위해 기본적으로 포함되어 있다. 애플리케이션 중 일부는 최소한 하나의 데이터베이스 테이블을 사용하므로 사용하기 전 데이터베이스에 테이블을 생성해야 한다. 그렇게 하려면 다음 명령을 실행해야한다.

$ python manage.py migrate

 

위 명령을 실행하면 적용된 각 마이그레이션에 대한 메시지가 표시된다.

 

migrate 명령은 INSTALLED_APPS 설정을 살펴보고 mysite/setting.py의 데이터베이스 설정과 함께 제공된 database migration 명령에 따라 필요한 데이터베이스 테이블을 생성한다.

 

모델 생성하기


· 모델: 부가적인 메타데이터를 가진 데이터베이스 구조를 말한다. 모델에는 저장하는 데이터의 필수 필드와 데이터의 동작이 포함된다.

 

설문조사 앱을 만들기 위해 Question과 Choice 두 가지 모델을 생성한다. 

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)

 

위 코드는 장고에 여러 가지 정보를 준다. 이것을 가지고 장고는 다음과 같은 것 들이 가능하다.

- 위 앱을 위한 데이터베이스 스키마를 생성할 수 있다.  (CREATE TABLE 명령)

- Question과 Choice 객체에 접근 하기 위한 파이썬 데이터베이스 접속 API를 생성한다.

 

· 각 모델은 django.db.models.Model 이라는 하위클래스를 통해 표현된다. 각 모델은 다양한 클래스 변수가 있고, 각 클래스 변수는 모델에서 데이터베이스 필드를 나타낸다.

 

· 데이터베이스의 각 필드는 Field 클래스의 인스턴스로 표현된다. 이는 각 필드가 어떤 자료형을 가질 수 있는지 장고에게 말해준다. 각 Field 인스턴스의 이름(question 등)은  데이터베이스 컬럼명으로 사용된다.

ex) CharField는 문자 필드를 표현하고, DataTimeField는 날짜와 시간 필드를 표현한다.  

 

· Field 클래스의 생성자에 첫번째 위치 인수를 전달하여 사람이 읽기 좋은 이름을 지정할 수 있다. 해당 인수를 사용하지 않으면, 장고는 기계가 읽기 좋은 형식의 이름을 사용한다. ex)  pub_date = models.DateTimeField('date published')

 

· 몇몇 Field 클래스들을 필수 인수가 필요하다. ex) CharField는 max_length를 입력해야한다.

 

· Field는 다양한 선택적 인수를 가질 수 있다. ex) votes = models.IntegerField(default=0) 를 통해 votes으 기본값을 0으로 설정한다.

 

· ForeignKey를 사용해 모델 간의 관계를 설정할 수 있다. ex) 위 예제에서는 Choice가 하나의 Question에 관계된다는 것을 장고에 알려준다.

 

모델 활성화하기


앱을 우리의 프로젝트에 포함시키기 위해 설정 클래스의 참조를 INSTALLED_APPS 설정에 더해야 한다. PollsConfig 클래스는 polls/apps.py 파일에 존재하므로 점으로 구분된 경로는 'polls.apps.PollsConfig'이다.

 

mysite/settings.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 앱이 포함된걸 알 수 있다. 다음 명령을 실행하면,

$ python manage.py makemigrations polls

 

다음과 같은 화면이 등장한다.

 

 makemigrations를 실행하여 장고에게 모델을 변경 했으며, 변경 사항을 마이그레이션으로 저장하기를 원한다고 말한다.

마이그레이션은 장고가 모델(및 데이터베이스 스키마)에 대한 변경 사항을 저장하는 방식이다. 이는 디스크 파일이며, 원하는 경우 새 모델에 대한 마이그레이션을 읽을 수 있다.

ex) polls/migrations/0001_initial.py

 장고가 변경하는 방식을 수동으로 조정하려는 경우에 대비하여 사람이 편집할 수 있도록 설계 되었다.

· sqlmigrate 명령을 통해 마이그레이션 이름을 가져와 해당 SQL을 반활 할 수 있다.

- sqlmigrate 명령은 실제로 데이터베이스에서 마이그레이션을 실행하지 않고, 화면에 출력하여 장고가 필요하다고 생각하는 SQL을 사용자가 직접 볼 수 있다.

- 장고가 무엇을 할 것인지 확인하거나 변경을 위해 SQL 스크립트가 필요한 데이터베이스 관리자가 있는 경우 유요할 수 있다. 

$ python manage.py sqlmigrate polls 0001

- 출력은 사용 중인 데이터베이스에 따라 다르다.

- 테이블 이름은 앱 이름과 모델의 소문자 이름을 결합하여 자동으로 생성된다.

- 기본키(id)가 자동으로 추가된다.

- 관례에 따라 장고는 외래키  필드 이름에 "_id"를 추가한다.

- 외래키 관계는 FOREIGN KEY 제약 조건에 의해 명시적으로 만들어진다.   

 

이제 migrate를 실행하여 해당 모델의 테이블을 데이터베이스에 생성하자.

$ python3 manage.py migrate

 

· migrate 명령은 적용되지 않은 모든 마이그레이션을 가져와서, 이것을 데이터베이스에 대해 적용한다.

- 기본적으로 모델에 대한 변경 사항을 데이터베이스의 스키마와 동기화한다.

- 장고는 django_migrations라는 데이터베이스의 특수 테이블을 사용하여 적용되는 항목을 추적한다.

 

마이그레이션은 데이터베이스 또는 테이블을 삭제하고 새 테이블을 만들 필요 없이 프로젝트를 개발하면서 시간이 지남에 따라 모델을 변경할 수 있다.

- 이는 데이터베이스 손실 없는 라이브 데이터베이스 업그레이드에 특화되어 있다.

 

모델 변경의 3단계:

1. models.py 파일에서 모델을 변경한다.

2. python manage.py makemigrations 명령으로 변경을 위한 마이그레이션을 생성한다.

3. python manage.py migrate 명령으로 데이터베이스에 변경을 적용한다.

 

마이그레이션을 수행하고, 적용하는 별도의 명령이 존재하는 이유: 마이그레이션을 버전 제어 시스템으로 커밋하고, 앱과 함께 제공할 수 있기 때문이다.

- 이렇게하면 개발을 더 쉽게 할 수 있고, 다른 개발자와 프로덕션에서도 사용할 수 있다.

 

API 사용하기


 

아래 명령을 통해 대화형 Python 셸로 이동하여, 장고가 제공하는 API를 사용해 보자.

$ python manage.py shell

 

다음과 같이 새로운 Question 객체를 생성하여 데이터베이스에 저장하고, 결과를 확인해 보자.

>>> from polls.models import Choice, Question
>>> Question.objects.all()
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
>>> q.save()
>>> q.id

결과

>>> q.question_text

결과

>>> q.pub_date

결과

>>> Question.objects.all()

결과

 

위의 결과 중 <Question: Question object (1)>은  객체에 대한 유용한 표현이 아니다. polls/models.py 파일의 Question, Choise에 __str__() 메서드를 더해 문제를 해결하자.

from django.db import models

class Question(models.Model):
    # ...
    def __str__(self):
        return self.question_text

class Choice(models.Model):
    # ...
    def __str__(self):
        return self.choice_text

 

위와 같이 수정한 후 다시 Question.objects.all() 명령을 수행하면, 다음과 같은 결과를 볼 수 있다.

 

해당 모델에 커스텀 메서드를 추가한다.

import datetime

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


class Question(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

 

 

장고 어드민


어드민 사이트를 생성하고 컨텐츠를 추가, 변경 및 삭제 하는 것은 창의성이 많이 필요하지 않은 지루한 직업이다. 다행히 장고는 모델에 대한 관리 인터페이스 생성을 완전 자동화한다.

 

어드민 사용자 생성하기

다음 명령을 실행하여 어드민 사이트를 로그인 할 수 있는 사용자를 생성한다.

$ python manage.py createsuperuser

 

사용자명, 이메일, 비밀번호를 입력한다.

 

개발 서버 시작하기

개발 서버를 시작하면, 장고 어드민 사이트는 기본적으로 활성화되된다. 서버를 실행한다.

$ python manage.py runserver

 

브라우저를 열고 http://127.0.0.1:8000/admin/ 링크에 접속하면, 다음 화면을 볼 수 있다.

 

어드민 사이트 접속하기

앞서 생성한 superuser 계정으로 로그인하면, 다음과 같이 장고 관리자 색인 페이지가 표시된다.

 

몇 가지 유형의 편집 가능한 컨텐츠(그룹 및 사용자)가 표시된다. 이것은 장고에서 제공하는 인증 프레임워크인 django.contrib.auth에서 제공된다.

 

어드민 사이트에서 수정 가능한 설문조사 앱 만들기

앞서 생성한 설문조사 앱이 어드민 사이트에서 보이지 않는다. 문제를 해결하기 위해 한 가지 작업을 더 해야 한다. Question 객체에 admin iterface가 있다는 것을 어드민에 알려야한다.

 

polls/admin.py 파일을 열고 다음과 같이 편집한다.

from django.contrib import admin

from .models import Question

admin.site.register(Question)

 

다시 어드민 사이트에 접속하면, 설문조사 앱이 추가된 걸 확인할 수 있다.

 

Questions을 클릭한다. 이동한 페이지에는 데이터베이스에 저장된 모든 Questions 들이 표시되고, 이 중 하나를 선택하여 변경할 수 있다.

 

"What's up"을 클릭하여 이를 수정해보자.

 

· 양식은 Question 모델로 부터 자동으로 생성된다.

· 여러 모델 필드 타입(DateTimeField, CharField)은 적절한 HTML 입력 위젯에 해당한다. 각 타입의 필드는 장고 관리자에 표시되는 방법을 알고 있다.

 각 DateTimeField에는 무료 JavaScript 단축키가 제공된다. ex) "Today" 바로가기, 캘린거 팝업, "Now" 바로가기, 시계 팝업

 Save and add another: 변경사항을 저장하고, 해당 객체를 위한 어드민 페이지를 다시 로드한다.

 Save and continue editing: 변경사항을 저장하고, 해당 타입의 객체에 대한 새로운 빈 양식을 로드한다.

"Date published"의 값이 실제 생성 시간과 일치하지 않으면, TIME_ZONE 설정에 대한 올바른 값을 설정해야한다.

반응형

댓글