21.12.25 Django 튜토리얼 Part2 첫번째 장고 앱 작성하기

2021. 12. 27. 16:28작업/Django

>>> Entry.objects.filter(pub_date__lte='2006-01-01')

SELECT * FROM blog_entry WHERE pub_date <= '2006-01-01';

데이터베이스 설치(지금은 sqlite3 쓸거라 아무것도 안해도 되지만, 추후에는 MySQL 설치해야함)

이제 ex_1222/settings.py를 열어서 데이터베이스를 설치한다.

나는 프로젝트에서는 MySQL을 쓸 것이지만 이 튜토리얼에서는 sqlite3을 쓰는 것 같다.

일단은 튜토리얼대로 따라가자.

settings.py 이 부분에서 'ENGINE' 저 부분을 만약 mysql을 쓸 거라면 이렇게 바꾼다.

'django.db.backends.mysql'

 

'NAME'은 데이터베이스의 이름이다. 만약 SQLite를 쓴다면 데이터베이스는 내 컴퓨터에 있는 파일이 된다. 그렇게 된다면 NAME은 반드시 전체 절대 경로로 지어야 한다. default는 BASE_DIR/'db.sqlite3' 이다. 한번 seoyoondb.sqlite3으로 바꿔보자

만약 근데 sqlilte를 사용하지 않고 MySQL같은 것을 쓴다면 다음과 같이 저 DATABASES 딕셔너리의 추가적으로 key와 value들을 더 설정해줘야 한다.

# 이 사람은 postgresql이라는 sql을 사용
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

이런 식으로?

 

또한, SQLite 이외의 데이터베이스라면 데이터베이스의 대화형 프롬프트 내에서 CREATE DATABASE seoyoondb; 명령을 실행한다. 그 못생긴 검은창에서 이거 쳐서 데이터베이스랑 테이플 같은 것을 만든다는 뜻인 것 같다.

SQLite라면 사전에 아무것도 미리 생성할 필요가 없다.

 

여기서 잠깐, 데이터베이스 의 종류에 대해

https://docs.microsoft.com/ko-kr/windows/wsl/tutorials/wsl-database

 

WSL을 통해 데이터베이스 추가 또는 연결

Linux용 Windows 하위 시스템 MySQL MongoDB, PostgreSQL, SQLite, Microsoft SQL Server 또는 Redis를 설정하는 방법을 알아봅니다.

docs.microsoft.com

MySQL은 데이터 형식이 서로 관련될 수 있는(RDBMS) 하나 이상의 테이블로 데이터를 구성하는 오픈 소스 SQL 관계형 데이터베이스입니다. 수직으로 확장할 수 있습니다. 즉, 하나의 최종 컴퓨터가 작업을 수행합니다. 현재 4개의 데이터베이스 시스템에서 가장 널리 사용됩니다.

PostgreSQL(Postgres라고도 함)은 확장성 및 표준 준수에 중점을 둔 오픈 소스 SQL 관계형 데이터베이스이기도 합니다. 이제 JSON도 처리할 수 있지만, 일반적으로 정형 데이터, 수평적 크기 조정 및 전자 상거래 및 금융 거래와 같은 ACID 호환 요구에 더 적합합니다.

Microsoft SQL Server Azure의 Windows, SQL Server on Linux 및 SQL 대한 SQL Server 포함합니다. 소프트웨어 애플리케이션에서 요청한 대로 데이터를 저장하고 검색하는 기본 기능을 갖춘 서버에 설정된 관계형 데이터베이스 관리 시스템이기도 합니다.

SQLite는 자체 포함된 오픈 소스 파일 기반 "서버리스" 데이터베이스로, 메모리가 부족한 환경에서도 이식성, 안정성 및 우수한 성능으로 알려져 있습니다.

MongoDB는 JSON과 함께 작동하고 스키마 없는 데이터를 저장하도록 설계된 오픈 소스 NoSQL 문서 데이터베이스입니다. 수평적으로 확장할 수 있습니다. 즉, 여러 개의 작은 컴퓨터가 자동으로 작업을 수행합니다. 유연성과 비정형 데이터, 실시간 분석 캐싱에 적합합니다.

Redis는 오픈 소스 NoSQL 메모리 내 데이터 구조 저장소입니다. 문서 대신 스토리지에 키-값 쌍을 사용합니다. Redis는 유연성, 성능 및 광범위한 언어 지원으로 알려져 있습니다. 캐시 또는 메시지 브로커로 사용할 수 있을 만큼 유연하며 목록, 집합 및 해시와 같은 데이터 구조를 사용할 수 있습니다.

선택한 데이터베이스의 종류는 데이터베이스와 함께 사용하는 애플리케이션의 유형에 따라 달라집니다. 정형 및 비정형 데이터베이스의 장점과 단점을 살펴보고 사용 사례에 따라 선택하는 것이 좋습니다.

 

일단 나는 WSL2를 통한 원격 우분투 환경에서 개발을 하므로 WSL에 MySQL을 설치해놓고 한번 데이터베이스를 만들어보자.

https://docs.microsoft.com/ko-kr/windows/wsl/tutorials/wsl-database

 

WSL을 통해 데이터베이스 추가 또는 연결

Linux용 Windows 하위 시스템 MySQL MongoDB, PostgreSQL, SQLite, Microsoft SQL Server 또는 Redis를 설정하는 방법을 알아봅니다.

docs.microsoft.com

 

그리고 settings.py에 TIME_ZONE이라는 딕셔너리도 있는데 이것은 'America/Chicago' 처럼 내가 사는 곳을 기준으로 시간을 설정하는 것 같다. default는 'UTC'이다

그리고 INSTALLED_APPS는 현재 장고 인스턴스에서 활성화된 모든 장고 앱들의 이름이 들어있다. 앱들은 다수 프로젝트에서 사용될 수 있고, 다른 프로젝트에서 쉽게 사용될 수 있도록 패키징하여 배포할 수 있다.

기본적으로 장고는 다음 앱을 포함한다.

django.contrib.admin - 관리용 사이트

django.contrib.auth - 인증 시스템

django.contrib.contenttypes - 컨텐츠 타입을 위한 프레임워크

django.contrib.sessions - 세션 프레임워크

django.contrib.messages - 메세지 프레임워크

django.contrib.staticfiles - 정적 파일을 관리하는 프레임워크

 

이런 기본 앱들 중 몇몇은 최소 하나 이상의 데이터베이스 테이블을 사용하는데 그러기 위해서는 DB에서 테이블을 미리 만들 필요가 있다. 그렇게 된다면 다음 명령을 실행한다.

$ python manage.py migrate

migrate 커맨드는 INSTALLED_APPS를 보고 필요한 데이터베이스 테이블을 만든다. (여기서 나는 그 데이터베이스의 ENGINE을 sqlite3으로 해놨으니 sqlite3의 형태인 파일로 만들지 않을까?)

migrate 명령은 INSTALLED_APPS에 등록된 앱에 한하여 실행된다.

 

모델 만들기

모델 : 부가적인 메타데이터를 가진 데이터베이스의 구조(layout)를 말한다.

우리의 polls 앱에서는 우리는 두 가지 모델이 필요하다

# 모델1 : Question

# 모델2 : Choice

  - 필드1: 텍스트

  - 필드2: 투표결과? vote tally

그리고 각 Choice는 Question과 연관되어 있다.

이런 개념은 파이썬 클래스를 의미한다. 이를 위해 polls/models.py 파일을 다음과 같이 수정하자.

각 모델에 필요한 컬럼을 정의하는 느낌이다. Char필드,  DateTime필드, ForeignKey필드(다른 테이블과 연결)

Integer필드가 있다. 저번에 했던 것처럼 최대길이(ID의 최대길이는 8자 등) 과 디펄트값을 지정할 수 있다.

on_delete = models.CASCADE는 무엇일까?

 

* CharField는 max_length가 필수 인수로 쓰인다고 한다. 꼭 써줘야 한다.

그 외에 default=0같은 건 선택적 인수라고 한다.

 

* ForeignKey는 각각의 Choice가 하나의 Question에 관계된다는 것을 장고에게 알려준다.

장고는 다대일, 다대다, 일대일과 같은 모든 일반 데이터베이스의 관계를 지원한다.(RDBMS)

 

여기 각 모델은 django.db.models.Model의 서브클래스를 대표한다. 각 모델은 데이터베이스의 필드를 의미하는 class변수를 갖고있다.

데이터베이스의 각 필드는 Field 클래스의 인스턴스로서 표현됩니다. CharField 는 문자(character) 필드를 표현하고, DateTimeField 는 날짜와 시간(datetime) 필드를 표현합니다. 이것은 각 필드가 어떤 자료형을 가질 수 있는지를 Django 에게 말해줍니다.

(여기서 파이썬코드의 필드 = 데이터베이스의 컬럼명 느낌인 것 같다.)

 

Model field reference | Django 문서 | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

모델의 활성화

장고는 저 위에 적은 모델의 정보에 대한 정보를 가지고 다음과 같은 일들을 한다

- 앱을 위한 데이터베이스 스키마 생성(CREATE TABLE)

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

(참고 장고의 앱들은 꼈다뺐다 할 수 있다. 앱을 다수의 프로젝트에서 사용할 수 있고 앱을 배포할 수도 있다.

특정 장고사이트에 앱이 묶여있지 않아도 된다. 그 로그인 앱처럼.??)

먼저 현재 프로젝트에게 polls앱이 설치되어있다는 것을 알려야 한다.

settings.py에서 다음과 같은 것을 추가한다.

makemigrations를 실행시킴으로서 모델을 변경시킨 사실과(이 튜토리얼은 새로운 모델을 만듦) 그 변경사항을 migration으로 저장시키고 싶다는 것을 장고에게 알려준다.

 

migrate 명령어는 migration을 실행시켜주고 자동으로 데이터베이스스키마를 관리해준다. migration은 내부적으로 어떤 SQL 문장을 실행한다. sqlmigrate명령은 migration이름을 인수로 받아 실행하는 SQL 문장을 보여준다.

BEGIN; CREATE TABLE 'polls_question' 어쩌구저쩌구..

CREATE TABLE 'polls_choice' 어쩌구저쩌구 CREATE INDEX 어쩌구 COMMIT; SQL문을 실행한다.

좀더 자세히 예를 들면 다음과 같다.(단 아래는 postgreSQL사용 시)

BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" (
    "id" serial NOT NULL PRIMARY KEY,
    "question_text" varchar(200) NOT NULL,
    "pub_date" timestamp with time zone NOT NULL
);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
    "id" serial NOT NULL PRIMARY KEY,
    "choice_text" varchar(200) NOT NULL,
    "votes" integer NOT NULL,
    "question_id" integer NOT NULL
);
ALTER TABLE "polls_choice"
  ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id"
    FOREIGN KEY ("question_id")
    REFERENCES "polls_question" ("id")
    DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");

COMMIT;

테이블 이름은 앱 이름과 모델의 이름(소문자)가 조합되어 자동생성된다. 기본 키(ID)가 자동으로 추가되며, 장고는 foreign 키 필드명에 '_id' 이름을 자동으로 추가한다.

 

그럼 이제 migrate를 실행시켜 데이터베이스에 모델과 관련된 테이블을 생성해보자

migrate 명령은 아직 적용되지 않은 마이그레이션을 모두 수집해 이를 실행하며(Django는 django_migrations 테이블을 두어 마이그레이션 적용 여부를 추적합니다) 이 과정을 통해 모델에서의 변경 사항들과 데이터베이스의 스키마의 동기화가 이루어집니다.

마이그레이션은 매우 기능이 강력하여, 마치 프로젝트를 개발할 때처럼 데이터베이스나 테이블에 손대지 않고도 모델의 반복적인 변경을 가능하게 해줍니다. 동작 중인 데이터베이스를 자료 손실 없이 업그레이드 하는 데 최적화 되어 있습니다. 튜토리얼의 나머지 부분에서 이 부분을 조금 더 살펴보겠습니다만, 지금은 모델의 변경을 만드는 세 단계의 지침을 기억하세요.

 

모델의 변경 3단계

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

# 2 python3 manage.py위치 makemigrations 로 이 변경사항에 대한 migration을 만든다

# 3 python3 manage.py위치 migrate 명령어로 변경사항을 데이터베이스에 적용한다.

 

API 가지고 놀기

그럼 이제 python 쉘에서 장고 API를 가지고 놀아보자

쿼리셋에 Question 객체를 생성하고 수정하고 저장하고.. 하는 것 같음

그런데 저 Question.objects.all()의 출력형태는 객체를 알아보기가 힘듦

따라서 polls/models.py에서 Question 모델을 수정해서 __str()__ 메소드를 Question과 Choice에 추가해보자

__str__를 추가하니까 다음과 같이 그냥 object (1) 이다~라고만 말해주는 게 아니라 걔의 텍스트를 알려준다

그 외 모델을 필터링하거나 get 하거나 create 하거나 count 하거나 등등이 가능하다

여기부턴 choice를 살펴봄

만든 choice_set에서 Just로 시작한느 질문부분을 지운다

 

필드를 찾아볼 때 __로 언더바 두개 쓰는 경우가 있는데 예를 들면 이 두개는 같은 뜻이다

# field lookup __사용해서
>>> Entry.objects.filter(pub_date__lte='2006-01-01')

# SQL 문
SELECT * FROM blog_entry WHERE pub_date <= '2006-01-01';

 

관리자용 사이트

직원용 사이트(관리자용사이트)도 장고에서는 자동으로 생성해준다. 그러니까 일반 소비자가 보는 화면과 달리

관리자가 보는 사이트가 다른 것이다. 

 

관리자 생성하기

이게 관리자 계정이다 관리자 이름은 seoyoonadmin이고 이메일은 예시로 syadmin@example.com이라고 했다

장고의 관리자 사이트는 기본으로 할성화되어있으니 그럼 이제 개발 서버를 시작한다

관리자(슈퍼유저)계정으로 로그인하면 다음과 같은 장고 관리 인덱스 페이지가 보인다.

관리자 사이트는 이렇게 편집 가능한 그룹과 사용자의 몇 컨텐츠를 볼 수 있는데 이들은 django.contrib.auth모듈에서 제공한다.

그럼 관리사이트에서 poll app이 구동되도록 admin.py를 변경한다!

이제 polls 앱이 등록됨

이 페이지는 데이터베이스에 저장된 모든 질문들을 보여주며, 그 중 하나를 선택하여 변경할 수 있습니다. 이전에 등록했던 《What’s up?》 질문이 있을 것입니다.