본문 바로가기
WebFramework/Python Django

[Python Django] 6. Django의 기본 파일 살펴보기 - models.py (1)

by Rosmary 2023. 8. 11.
728x90
반응형

 

 

 

무려 2년 만에 작성하는 Django 포스팅이다. 사실 최근까지 블로그를 진행할 만한 여력이 전혀 없었다. 확실히 업무상으로나 개인 프로젝트 상으로 습득한 내용을 시간을 들여 정리하지 못하다보니, 기억에 잘 남지 않아 요즘들어 고생을 하고 있는 상황이다.

 

최근에 Django를 사용할 기회가 생겨  2년 전에 작성한  Django 포스팅을 다시 참조하고 있는 중이다. 확실히 자신이 정리한 내용을 보는 것이 잃어버린 기억을 회복하는데 있어 가장 좋은 방법임을 요즘들어 느끼고 있다. 그래서 지금 습득하는 Django 내용도 다시 간략하게나마 남기려 한다(확실히 포스팅을 안하다 하려니 귀찮음이 상당하다).

 

이번 포스팅에서는 2년 전 마지막 Django 포스팅의 막판에 잠깐 언급한 models.py 파일에 대해 알아보려한다. 아마 몇 개의 포스팅에 걸쳐 자료가 작성될 듯 하다. 

 

 

 

1. models.py의 기능은?

 

models.py는 Django app을 생성하면 기본적으로 제공되는 python 파일 중 하나다. 이 파일의 기능은 Django App에 사용할 DB를 정의하는 것이다.

 

대부분의 웹 서비스는 직접 DBMS(Database Management System)에 접속한 뒤 쿼리를 날려 웹 서비스에 필요한 DB 테모델을 생성한다. 하지만 Django는 ORM(Object-Relational-Mapping)이라 불리는, 프로그래밍 언어만으로도 DB 모델을 생성할 수 있는 기능을 제공한다. 그리고 이 기능을 중계하는 파일이 models.py다.

 

MySQL, PostGreSQL 등의 모든 DB 프로그램은 자료를 저장할 Table을 먼저 생성한 뒤, 생성된 Table에 필요한 Data를 저장하는 방식을 사용한다. Python의 models.py는 일반적인 DB와는 조금 다르게, 자료를 저장할 Table만 만드는 단계까지만 관여한다. 

 

사이트 정보에 대한 내용을 DB로 만들어본다고 하자. 사이트 정보는 간략하게 '사이트 이름(site_name)'과 '사이트 주소(site_url)'만 DB에 저장한다고 하면, Table은 아래와 같은 모양이 나타날 것이다.

 

[사이트 Table]

id site_name site_url
     
     

 

정리하자면 models.py는 웹 서비스에 필요한 Data를 저장할 테이블에 대한 모델(model)링과 연관된 파일이라 보면 된다.

 

 

 

2. 실습 환경 구성

 

마지막 포스팅의 자료는 너무 오래되어 필자의 PC에 남아있지 않은 관계로, 새 프로젝트를 만든 뒤 siteInfo라는 이름의 어플리케이션을 만들려고 한다. Django 프로젝트 폴더에서 아래의 명령어를 실행하여 생성하던가 아래에 참조 링크를 달아놓은 포스팅을 참고하도록 하자.

 

#  django-admin startproject {프로젝트명}

#  cd {프로젝트명}

#  django-admin startapp siteInfo

 

* 포스팅 참고.

- Django 프로젝트 만들기

- Django 어플리케이션 만들기

 

[Python Django] 1. Django 설치, 개발 환경 구성 및 기본 설정/구동

필자가 최근 진행하려는 장기 프로젝트 건으로 인해 웹 페이지 개설에 대한 내용을 이리저리 찾아보고 있는 중이다. 이전에 IT로 전직을 결심하고 처음으로 시작했던 독학 내용이 HTML, CSS, JavaScri

whitewing4139.tistory.com

 

 

[Python Django] 4. Django의 기본 파일 살펴보기 - views.py(1)

지난 포스팅까지 Django 프로젝트 실행 시 나타나는 기본 파일 중 자주 사용하는 settings.py와 urls.py에 대해 살펴보았다. 두 파일의 역할을 간략하게나마 다시 정리하자면, settings.py는 Django 웹 서버

whitewing4139.tistory.com

 

 

 

지금 상황에서 urls.py나 views.py는 당장 볼 필요가 없으니 생성한 app만 setting.py에 등록하도록 하자.

 

 

기타 필요한 settings.py 설정은 아래의 포스팅을 참고하자

 

* 포스팅 참고

- Django settings.py 설정

 

[Python Django] 2. Django의 기본 파일 살펴보기 - settings.py

django-admin을 이용하여 프로젝트를 생성하면, 프로젝트에 필요한 기본적인 파일이 프로젝트명 파일 아래에 생성된다. 가령, 필자가 django-admin start project TEST 라는 명령어를 입력하면, TEST 라는 폴

whitewing4139.tistory.com

 

 

3. models.py 작성

 

생성한 siteInfo 앱 폴더를 보면 models.py 파일이 기본적으로 제공되는 것을 확인할 수 있다.

migrations 폴더는 models.py와 밀접한 관계가 있다는 것만 우선 알아두자.

 

이 파일을 열어보면 단지 django 패키지 하나만 from import 문으로 작성되어 있을 뿐 아무 내용도 없음을 확인할 수 있다.

 

 

(1) 테이블 생성

 

models.py 파일은 자료를 저장할 Table을 생성하는 기능을 한다고 했다. 이 Table은 반드시 Class 타입으로만 생성이 가능한데, Table을 생성하는 클래스는 반드시 Django의 models.Model 클래스를 상속해야한다. 

 

따라서 아래와 같은 형태로 Table 클래스가 작성된다.

----------------------------------------------

class {Table명}(models.Model):

    # Class 내용 입력

----------------------------------------------

    

위와 같은 형태로 models.py를 작성해보자. 필자는 사이트 정보를 저장할 Table 명을 Site로 지정하려한다. 따라서 models.py는 아래와 같은 구조를 가지게 된다.

 

 

(2) Table 컬럼 만들기

 

현재까지 진행한 상황은 만들고자 하는 Table의 이름만 지정한 상태다. 어떠한 형태의 Table(표)도 생성된 상태가 아니다.

필자가 위에서 설계한 site info의 Table을 보면 id, site_name, site_url이라는 컬럼(세로줄 제목)이 나타나는 것을 볼 수 있는데, 이 컬럼들은 생성한 Table 클래스 내 변수로 생성하면 된다. 즉,

 

----------------------------------------------

class {Table명}(models.Model):

    컬럼제목1_변수

    컬럼제목2_변수

----------------------------------------------

 

와 같은 형태를 띈다. 단, ID는 Django에서 pk라는 변수로 자동 부여하기 때문에 models.py에 직접 작성할 필요가 없다. 위의 내용을 적용하면 아래와 같은 내용의 models.py가 작성된다.

 

 

 

(3) 컬럼의 Data Type 지정하기

 

그런데, 문제가 하나 있다. 대부분의 DBMS는 컬럼에 들어갈 자료의 타입을 미리 지정해주어야한다. 무슨 이야기냐 하면, Python에 정의한 하나의 변수가 정수, 문자열, Dictionary 등등등의 자료를 전부 정의할 수 있는 것과 달리, DBMS는 Java처럼 저장될 값의 Type을 일일이 입력해주어야 한다. 예를 들어, 개인 정보가 포함된 DB의 경우 '나이' 컬럼은 반드시 정수형(int)만 들어가도록 table 생성 시 설정해야한다는 것이다. 

 

age 컬럼은 절대 숫자가 아닌 값을 가지지 못한다.

 

컬럼에 들어갈 Data의 자료형 지정은 import한 패키지인 models에서 제공하는 자료형 클래스를 인스턴스화하는 방식으로 진행한다.

 

----------------------------------------------

class {Table명}(models.Model):

    컬럼제목1_변수 = models.{자료형Class()}

    컬럼제목2_변수 = models.{자료형Class()}

----------------------------------------------

 

 

우선, 필자가 생성하는 Table의 site_name, site_url 컬럼 모두 문자열 형태로 입력되어야 하는데, 문자열을 지정하는 models 패키지의 클래스는 CharField()다. 

 

CharField는 max_length가 필수 Parameter다. 없는 경우 에러가 발생한다.

 

models에서 제공하는 클래스 종류와 클래스의 필수 Parameter에 대해서는 이번 포스팅의 후반부에 간략하게 표로 정리할 예정이다. 시간이 허락하면 몇몇 클래스는 별도의 포스팅에서 다루어보려고 한다. 

 

 

 

4. models.py의 DBMS 적용

 

Site라는 이름의 Table에 대한 정의는 이것으로 끝이다. 하지만 단지 DB 모델에 대한 정의만 했을 뿐, 이 정의된 파일을 DBMS에 적용하지 않은 상태다. 파일을 저장하고 manage.py가 있는 폴더로 이동하자.

 

 

Django의 setting.py의 Database 부분을 보면 알겠지만, models.py에 정의된 내용을 DBMS에 적용하면 db.sqlite라는 파일이 생성되도록 설정되어 있다.

 

 

이 파일을 생성하기 위해 manage.py에 정의된 명령어를 사용해야한다. 

 

 

(1) makemigration 명령어

 

makemigration은 models.py에 정의된 내용을 DBMS에 적용하기 전 migrations 폴더에 현재의 내용을 저장한 파일을 생성하는 단계다. 아래와 같이 makemigration 명령어 뒤에 app 폴더명을 작성하면, app 폴더 내의 models.py 내용을 migrations 폴더 내에 스냅샷처럼 저장하게 된다.

 

# 명령어: python manage.py makemigrations siteInfo

 

(2) migrate명령어

 

migrations에 만들어진 파일은 아직 DBMS에 적용된 상태가 아니다. 단지 스냅샷 형태로 당시 만들어진 내용을 저장만 하고 있을 뿐이다. migrations 내에 생성된 파일을 열어보면, 실제 DBMS에 적용되는 쿼리가 작성되어 있음을 확인할 수 있다.

 

참고로 이 내용은 manage.py의 showmigrations 명령어를 사용해도 확인할 수 있다. 자세한 내용은 다른 포스팅에서...

 

이 쿼리를 DBMS에 적용하기 위해서는 manage.py의 migrate 명령어를 사용한다.

 

#  명령어: python manage.py migrate [App 폴더명] [migrate버전번호]

 

 

참고로 위의 결과는 Django에서 제공하는 기본 DB까지 같이 migrate되었기 때문에 siteInfo 앱 외의 다른 내용도 함께 migrate 되는 것으로 나온 것이다. 만약 migrate 명령어 뒤에 특정 App 이름만 지정할 경우, 해당 App만 migrate이 진행된다.

 

 

(3) showmigration

 

웹 서버 DB 모델링을 진행하다보면 분명 DB의 모델을 변경해야 하는 상황이 발생한다. 변경이 발생할 때마다 makemigration로 생성된 migration 파일이 증가하게 되는데, 이 파일들이 DBMS에 적용되어 있는지 확인하려면 manage.py의 showmigrations 라는 명령어를 사용한다.

 

# 명령어: python manage.py showmigrations [App 폴더명]

 

siteInfo의 내용을 보면 방금 migrate으로 적용한 0001 버전은 앞부분에 [X] 표시가 되어 있는 것을 확인할 수 있는데 이 [X] 표시가 되어 있는 경우, DBMS에 해당 버전의 내용이 적용되어 있다는 의미다. 만약 migrate으로 적용되지 않은 경우, 아래와 같이 나타난다.

 

 

 

 

 

5. models 패키지의 Field 종류

 

models 패키지에 존재하는, DB Column 자료형과 관련되는 Class의 종류는 아래와 같다.

 

* 는 각 필드 클래스 호출 시 필수 Parameter를 의미함.

Class 명 자료형 기타 설명
AutoField int 1부터 정수형 자료를 지정하며, 테이블에 자료가 추가되면 자동으로 1이 증가된 숫자를 추가함. 보통 ID나 순번 등 Primary Key 역할을 하는 컬럼에 사용.
BigAutoField int 1 ~ 9223372036854775807사이 숫자를 입력받을 때 사용. 
BigIntegerFIeld int -9223372036854775808 ~ 9223372036854775807 사이 숫자를 입력받을 때 사용.
BinaryFIeld bytes bytes 단위 숫자, bytearry를 입력받을 때 사용.

[parameter]
max_length: 입력받을 bytes의 최대 길이 지정(int)
BooleanField bool True / False 지정 시 사용. 기본값은 None으로 지정됨.
CharField char, string 문자 또는 문자열(VARCHAR)을 입력받을 때 사용.

[Parameter]
* max_length: 필드에 입력받을 문자열의 최대 길이 지정(int)
DateField date 날짜를 입력받을 때 사용

[Parameter]
auto_now: 기본값으로 현재 날짜를 입력받을지 여부 설정(True / False).
                  True일 경우, 데이터가 테이블에 저장되는 순간의 날짜를
                  기본값으로 지정하게 됨.
auto_now_add: (True / False)
DateTieField datetime 날짜, 시간을 입력받을 때 사용

[Parameter]
auto_now: 기본값으로 현재 날짜와 시간을 입력받을지 여부 설정(True / False).
                  True일 경우, 데이터가 테이블에 저장되는 순간의 날짜, 시간을
                  기본값으로 지정하게 됨.
auto_now_add: (True / False)
DecimalField double
float
소수를 입력받을 때 사용

[Parameter]
* max_digit: 소수의 최대 자릿수 지정(int).
                    반드시 decimal_place보다 큰 값을 가져야 함.
* decimal_place: 소수점이 위치할 자리 지정(int) 

ex) models.DecimalField(max_digit=5, decimal_place=2)  ->  982.53 or 184.42
DurationField timedelta 시간 또는 일자 차이를 입력받을 때 사용.
DB에서 INTERVAL DAY(N) TO SECOND(N) 형태로 사용됨.
EmailField string CharField에서 Email 형태의 값을 입력받을 수 있도록 검증한 Field

[Parameter]
* max_length: 필드에 입력받을 문자열의 최대 길이 지정(int)
FileField string File Upload 위치 지정을 위한 Field

[Parameter]
* upload_to: 파일을 업로드 할 경로 지정
FilePathField ? ?
FloatField float 소수점 입력 시 사용.
GenericIPAddressField   CharField에서 IP형태의 값을 입력받을 수 있도록 검증한 Field

[Parameter]
protocol: IP Address Type을 지정. (both / IPv4 / IPv6)
               기본값으로 both를 사용함.
unpack_ipv4: IPv6 주소를 IPv4로 변환할지 여부를 설정(True / False)
                True 설정 시, protocol은 반드시 'both'로 설정되어야 함.
ImageField    
IntegerField int -2147483648  ~ 2147483647 사이 정수 입력 시 사용.
JSONField dict Json으로 encoding된 자료를 저장할 때 사용

[Parameter]
encoder: json에서 직렬화를 지원하지 않는 데이터(datetime, uuid)를 직렬화 할 때 
              사용할 encoding 방식을 지정. 기본값은 json.JSONEncoder를 사용함.
decoder: json에서 DB로부터 직렬화된 값을 추출하기 위해
              사용할 encoding 방식을 지정. 기본값은 json.JSONEncoder를 사용함.
PositiveBigIntegerField
PositiveIntegerField
PositiveSmallIntegerField
int 0 ~ 9223372036854775807
0 ~ 2147483647 
0 ~ 32767
사이 숫자를 입력받을 때 사용. 
SlugField string URL 등에 Label을 위해 사용하는 문자열을 입력받기 위해 사용.

[Parameter]
allow_unicode: 입력값으로 unicode encoding 사용 여부 설정(True / False)
                         기본값은 False임.
max_length: 입력받을 최대 문자열 길이 지정. (int)
                     미지정 시 50이 max_length 값으로 지정.
SmallAutoField integer AutoField와 유사하나 1 ~ 32767 사이 숫자로 범위가 한정됨.
SmallIntegerField integer -32768 ~ 32767 사이 숫자 입력 시 사용.
TextField string 여러 줄의 문자열을 입력받을 때 사용함(게시판 본문, 블로그 본문 작성 등)

[Parameter]
max_length: 필드에 입력받을 문자열 최대 길이 지정(int).
                     CharField 등과 달리 사용을 강제하지 않음.
TimeField time 시간을 입력받을 때 사용

[Parameter]
auto_now: 기본값으로 현재 시간을 입력받을지 여부 설정(True / False).
                  True일 경우, 데이터가 테이블에 저장되는 순간의 시간을
                  기본값으로 지정하게 됨.
auto_now_add: (True / False)
URLField string CharField에서 URL형태의 값을 입력받을 수 있도록 검증한 Field

[Parameter]
* max_length: 필드에 입력받을 문자열의 최대 길이 지정(int)
UUIDField Universally Unique
IDentifier
UUID 값을 입력받을 때 사용함.
AutoField나 SmallAutoField 대신 Primary Key 역할을 할 수 있음.

 


 

 

 

Fin.

반응형

댓글