모델은 웹 어플리케이션에서 사용할 데이터를 명세한 python소스코드이다. 모델은 데이터베이스와 연동되며, 간단한 경우 모델 하나가 데이터베이스 테이블 하나로 매핑된다. 따라서 웹 개발자는 데이터베이스를 직접 손대지 않고 소스코드인 모델을 변경해가면서 작업을 진행할 수 있다. 모델을 변경할 때마다 django에서 제공하는 manage.py syncdb를 이용하면 변경된 모델이 데이터베이스 테이블에 반영된다.

테이블 생성

모델은 사용자가 지정하지 않는 경우 기본적으로 id라는 이름으로 정수형 주키를 가진다.
class Risk(models.Model):
    #id = models.AutoField()
    name= models.CharField(maxlength=10)
    ...

모델에 해당하는 테이블을 생성하는 SQL문은 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)
다대다 관계는 좀더 복잡해질 수 있다. 두 모델 사이에 관계에 해당하는 테이블이 또다른 속성이 필요한 경우이다. 이 때는 중간 역할을 하는 모델을 직접 생성하고 양쪽 모델을 참조하도록 만든다. 다음은 RiskReportControlReport사이 다 대 다 관계에서 보고된 위험에 대해서 대처 방안이 적절했는지 평가하는 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클래스를 재정의해서 이를 삽입, 삭제, 갱신할 수 있는 기본적인 관리자 인터페이스를 자동으로 생성해준다. 사용자 인터페이스는 입력 항목을 원하는대로 배치할 수 있으며, 원하는 디자인도 적용할 수 있다. 이것으로 기본적인 입력 시스템은 만들어졌다.
Screenshot-Django-site-admin.png

Screenshot-ManyToOne.png

Screenshot-ManyToMany.png

----
django/Example
Retrieved from http://wiki.zeropage.org/wiki.php/django/Model
last modified 2021-02-07 05:31:39