모델은 웹 어플리케이션에서 사용할 데이터를 명세한 python소스코드이다. 모델은 데이터베이스와 연동되며, 간단한 경우 모델 하나가 데이터베이스 테이블 하나로 매핑된다. 따라서 웹 개발자는 데이터베이스를 직접 손대지 않고 소스코드인 모델을 변경해가면서 작업을 진행할 수 있다. 모델을 변경할 때마다 django에서 제공하는 manage.py syncdb를 이용하면 변경된 모델이 데이터베이스 테이블에 반영된다.
테이블 생성 ¶
모델은 사용자가 지정하지 않는 경우 기본적으로 id라는 이름으로 정수형 주키를 가진다.
모델에 해당하는 테이블을 생성하는 SQL문은
class Risk(models.Model): #id = models.AutoField() name= models.CharField(maxlength=10) ...
python manage.py sql <app name>
으로 확인할 수 있다. 위에 해당하는 SQL문은 다음과 같다.
CREATE TABLE "manage_risk" ( "id" integer NOT NULL PRIMARY KEY, "name" varchar(10) NOT NULL );
다 대 일 관계 ¶
다 대 일 관계에서는 다 쪽에서 일쪽을 참조하도록 설계해야 한다.
class RiskReport(models.Model): risk= models.ForeignKey(Risk) ...혹은 모델이 되는 클래스의 이름을 문자열로 지정할 수도 있다. 이는 클래스를 정의하는 순서에 상관없이 한 모델이 다른 모델을 참조할 수 있도록 한다.
class RiskReport(models.Model): risk= models.ForeignKey('Risk') ...
다 대 다 관계 ¶
다 대 다 관계에서는 어느 한 쪽 모델에 다 대 다 관계임을 표현한다. 하지만 양쪽 모두에 다 대 다 필드를 설치하면 안된다. Django는 다 대 다 관계인 경우 이를 표현하는 테이블을 자동으로 생성한다. 다음은 Employee와 Deparment모델 사이에 다 대 다 관계를 나타내고 있다.
class Employee(models.Model): name= models.CharField(maxlength=100) email= models.EmailField() class Department(models.Model): name= models.CharField(maxlength=100) location= models.CharField(maxlength=200) employees= models.ManyToManyField(Employee)다대다 관계는 좀더 복잡해질 수 있다. 두 모델 사이에 관계에 해당하는 테이블이 또다른 속성이 필요한 경우이다. 이 때는 중간 역할을 하는 모델을 직접 생성하고 양쪽 모델을 참조하도록 만든다. 다음은 RiskReport와 ControlReport사이 다 대 다 관계에서 보고된 위험에 대해서 대처 방안이 적절했는지 평가하는 is_vaild속성을 가지는 RiskControl모델을 보여주고 있다.
class RiskReport(models.Model): class ControlReport(models.Model): class RiskControl(models.Model): risk_report= models.ForeignKey(RiskReport) control_report= models.ForeignKey(ControlReport) is_vaild= models.BooleanField()하지만 이 경우 risk_report와 control_report의 합성키를 사용하도록 지원하지 않는다.
Admin ¶
Django는 정의한 모델에 Admin클래스를 재정의해서 이를 삽입, 삭제, 갱신할 수 있는 기본적인 관리자 인터페이스를 자동으로 생성해준다. 사용자 인터페이스는 입력 항목을 원하는대로 배치할 수 있으며, 원하는 디자인도 적용할 수 있다. 이것으로 기본적인 입력 시스템은 만들어졌다.
----
django/Example
django/Example