ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Django - 03 Model 코딩
    Django 2021. 3. 31. 17:02

    모델 작업은 데이터베이스에 테이블을 생성하는 작업이다. 다음 순서대로 진행한다.

    >notepad models.py                // 테이블을 정의함
    >notepad admins.py                // 정의된 테이블이 Admin 화면에 보이게 함
    >python manage.py makemigrations  // 데이터베이스에 변경이 필요한 사항을 추출함 
    >python manage.py migrate         // 데이터베이서에 변경사항을 반영함
    >python manage.py runserver       // 현재까지 작업을 개발용 웹 서버로 확인함

     

    테이블 정의

    앞에서 설계한 것처럼, polls 애플리케이션은 Question과 Choice 두 개의 테이블이 필요하다. 테이블은 models.py 파일에 정의한다. 

    장고에서는 테이블을 하나의 클래스, 테이블의 컬럼은 클래스의 변수(속성)로 매핑한다. 테이블 클래스는 django.db.models.Model 클래스를 상속받아 정의하고, 각 클래스 변수의 타입도 장고에서 미리 정의된 필드 클래스를 사용한다.

     

    - Question 테이블 컬럼과 클래스 변수 간의 매핑

    테이블 컬럼명 컬럼 타입 장고의 클래스 변수 장고의 필드 클래스
    id integer (id) (PK는 장고에서 자동 생성)
    question_text varchar(200) question_text models.CharField(max_length=200)
    pub_date datetime put_date models.DateTimeField('date published')

     - Choice 테이블 컬럼과 클래스 변수 간의 매핑

    컬럼명 타입 장고의 클래스 변수 장고의 필드 클래스
    id integer (id) (PK는 장고에서 자동 생성)
    choice_text varchar(200) choice_text models.CharField(max_length=200)
    votes integer votes models.IntegerField(default=0)
    question_id integer question models.ForeighKey(Question)

     

    유의할 사항은 다음과 같다

    • PK(Primary Key)는 클래스에 지정해주지 않아도, 장고는 항상 PK에 대한 속성을 Not Null 및 Autoincrement로 이름은 id로 자동으로 만들어 준다.
    • DateTimeField() 필드 클래스에 정의한 date published는 pub_date 컬럼에 대한 레이블 문구다. 
    • FK(Foreign Key)는 항상 다른 테이블의 PK에 연결되므로, Question 클래스의 id 변수까지 지정할 필요 없이 Question 클래스만 지정하면 된다. 실제 테이블에서 FK로 지정된 컬럼은 _id 접미사가 붙는다.
    • __str__() 메소드는 객체를 문자열로 표현할 때 사용하는 함수다. Admin 사이트나 장고 쉘 등에서 테이블명을 보여줘야 하는데, __str__() 메서드를 정의하지 않으면 테이블명이 제대로 표시되지 않는다.

     

     

    Admin 사이트에 테이블 반영

    models.py 파일에서 정의한 테이블도 Admin 사이트에 보이도록 등록한다.

    admin.site.register() 함수를 사용하여 임포트한 클래스를 Admin 사이트에 등록해주면 된다. (이와 같이 테이블을 새로 만들 때는 models.py와 admin.py 두 개의 파일을 함께 수정해야 한다.)

     

     

    데이터베이스 변경사항 반영

    테이블의 신규 생성 등 데이터베이스에 변경이 필요한 사항이 있으면, 이를 데이터베이스에 실제로 반영해줘야 한다. 아직까지는 클래스로 테이블 정의만 변경한 상태다. 다음 명령으로 데이터베이스에 반영한다.

    migrations은 테이블 및 필드의 생성, 삭제, 변경 등의 데이터베이스에 대한 변경사항을 알려주는 정보다. 물리적으로는 애플리케이션 디렉터리 별로 migrations 파일이 존재한다. 예제에서는 makemigrations 명령에 의해 polls/migrations 디렉터리 하위에 마이그레이션 파일들을 만들고, 이 파일들을 통해 migrate 명령으로 데이터베이스 테이블을 만든다.

    models.py 모듈에 정의한 테이블을 migrate 명령으로 데이터베이스에 반영할 때, python manage.py sqlmigrate polls 0001 명령을 통해 SQL 문장을 확인할 수 있다.

     

     

     

Designed by Tistory.