파이썬 class에서 상속에 대해 배운 것을 이렇게 사용할 줄이야...
django는 세 가지 모델 상속 타입을 제공한다. python에서 상속이란 다른 class를 물려받는 행위를 말한다. 여기서도 하나의 상속 class를 만들어 두면 다른 class에서 중복 선언할 필요 없이 간단하게 코드를 물려받을 수 있다. 테이블마다 똑같은 필드를 가지고 있다면, 부모 model을 만들고 각 모델에 상속시키는게 관리하기도 쉽고 코드도 깔끔하다.
상속으로 사용할 model은 기본 class는 django.db.models.Model
을 상속받아야 한다.
추상을 기반으로 부모 class를 만든다. class Meta에 'abstract = True' 구문을 넣으면 하위 모델에 이 모델의 필드를 추가시킬 수 있다. migrate 시에 database table에 추가되지 않아 부모 class를 독립적으로 사용할 수는 없다.
migrate를 하면 users라는 table 하나가 만들어 진다. 이 table 안에는 email, password라는 필드 외에도 created_at, updated_at이라는 필드도 같이 만들어 진다.
추상클래스 없이 상속한다. 부모와 자식 모델 모두 테이블이 생성되므로, 부모 객체로부터 자식 객체를 호출하는 것이 가능하다(parent.child
). 부모와 자식 간에 OneToOneField가 자동으로 적용된다. 단, 자식 테이블에 대한 각 query에 대해 부모 테이블로의 join이 필요하여 그렇게 효율적인 상속 방법은 아니다.
원래 모델에 대해서만 테이블이 생성된다. 원래 모델에 대리자를 만들어서 대리 모델의 인스턴스를 만들고 없애고 수정할 수 있고, 대리 모델이 데이터를 저장도 할 수 있다. 원본 모델을 변경하지 않고 프록시에서 기본 모델의 순서 또는 관리자 같은 것을 변경할 수 있는 것이다. 즉, proxy modles는 기존 모델에서 필요한 기능만 추가해야할 때 사용한다.
프록시 모델은 일반 모델처럼 선언하며 Django에게 meta class에서 proxy속성을 True로 설정하여 프록시 모델이라고 알려준다.