2010년 6월 7일 월요일

03. Model

 

django에서 자료를 저장하는 것은 Model이 담당한다.

django의 Model은 DB 저장을 위한 일종의 API로 각종 Database engine(sqlite3, postgresql, mysql, oracle등)의 Wrapper의 역할을 한다.

model은 models.py 파일을 django의 application별로 작성하여 구현한다.(즉, Application 별로 관리된다고 생각하면 되겠다)

 

django에서 application 을 생성하는 것은

python manage.py startapp Application_Name

을 통해 생성하고  application이 생성되면 application명의 디렉토리 하위에 models.py라는 파일이 생성되는데 이곳에 저장정보(table 정의)를 기술하는 것으로 Model을 정의한다.

 

생성된 Application 을 django 프로젝트에 등록하여야 사용이 가능한데 등록하기위해서는 settings.py의 INSTALLED_APPS에 해당 사항을 다음과 같이 지정해 주어야 한다.

settings.py

INSTALLED_APPS = (


    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'projectName.applicationName',          # 예를 들어 프로젝트명이 djangoTest, 애플리케이션 명이 myTest일 경우 'djangoTest.myTest',)

 

저장정보에 대한 기술은  django의 Model API를 따른다.

 

다음은 간략한 사용법으로 application의 models.py에 기록한다.

  • 필요한 module import

    • from django.db import models
  • 저장공간 정의

    • class name (models.Model) :

      열 정의

 

위의 방법으로 생성된 models.py에 따른 저장공간을 생성하려면 콘솔에서 다음과 같이 입력한다.

python manage.py syncdb

저장공간 정의 등 변경이 생길때마다 위의 구문을 콘솔에서 입력하면 django가 DB engine에 맞는 sql을 생성해서 DB에 Table로 저장을 한다.

예제) application : itemBank

        생성할 저장공간 : Items(myText), Options(myItem(FK), myText)

        models.py

class Items(models.Model):
    myText = models.TextField()

class Options(models.Model):
    myItem = models.ForeignKey(Items)
    myText = models.TextField()

 

위의 정의에 따라 django가 만든 sql은 다음과 같이 확인할 수 있다. (사용된 DB는 python 2.5부터 내장되어 있는 sqlite3)

python manage.py sql application_name

위의 예제에 따라 생성된 sql 확인은 다음과 같다.

python manage.py sql itemBank

BEGIN;
CREATE TABLE "myTest_items" (
    "id" integer NOT NULL PRIMARY KEY,
    "myText" text NOT NULL
)
;
CREATE TABLE "myTest_options" (
    "id" integer NOT NULL PRIMARY KEY,
    "myItem_id" integer NOT NULL REFERENCES "ibTwo_items" ("id"),
    "myText" text NOT NULL
)
;
COMMIT;

 

살펴보면 각 저장공간(table)별로 자동으로 id라는 컬럼이 생긴 것을 확인할 수 있다.

이는 django가 PK로 사용할 컬럼을 자동으로 만드는 것으로 필요하다면 만들지 않을 수 도 있으나 기본 상태에서는 자동으로 만들게 된다.

또한 위에 생성된 sql은 저장되는 DB에 따라 다르게 작성되는데 DB를 바꿀때마다 sql문을 바꾸지 않아도 된다는 것은 큰 장점으로 여겨진다.

물론 각 DB에 맞게 설정파일인 setting.py를 변경하고 필요한 드라이버(psycopg, mysqldb 등)를 설치하여야 하지만

개발 환경 구축에 드는 수고를 조금만 한다면 개발 단계에서 서로 다른 DB를 위한 wrapper class를 만들지 않아도 되는 것은 개발자에겐 부담을 덜어주는 것이라 하겠다.

 

이 글은 스프링노트에서 작성되었습니다.

댓글 없음:

댓글 쓰기