Model Inheritance

dooh kim·2020년 9월 1일
0

django-model-document

목록 보기
6/7

app
├── config
│   ├── init.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py

│   └── wsgi.py
├── inheritance
│   ├── init.py
│   └── abstract
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── db.sqlite3

app 이 너무 많아 지면서 django는 app을 단순 abc 순서대로 정렬 해놓기 때문에 package화 하여 의미대로 정리하기 위해 작업을 한다.

inheritance 라는 package를 만들어 준다
cd inheritance
python ../manage.py startapp abstract
하면 위에 그림처럼 app이 구현된다

이렇게 app이 추가 되었을 때

inheritance/abstract/apps.py

껍데기뿐인 inheritance를 앞에 작성해준다.

from django.apps import AppConfig


class AbstractConfig(AppConfig):
    name = 'inheritance.abstract'

Model Inheritance(Document)

Mixin class
단독으로 동작하는 것이 아니라
다른 클래스에 붙허서 속성이나 method 추가 기능을 제공하는 것

공통된 정보를 다른 모델에 넣으려 할 때 유용하다!!

"""
1. AbstractBaseClasses
    부모는 테이블이 없고, 자식은 테이블이 있음
2. Multitable inheritance
    부모와 자식 모두 테이블이 있음
3. Proxy model
    부모는 테이블이 있고, 자식은 테이블이 없음임

업무에서는 세개 다 쓰임
"""
from django.db import models


class CommonInfo(models.Model):
    name = models.Charfield(max_length=20)
    age = models.PositiveIntegerField()
    
    class Meta:
    	abstract = True
        

class Student(CommonInfo):
	school = models.CharField(max_length=200)
    
    def __str__(self):
    	return f'{self.name} (학교 : {self.school})'
        

class Instructor(CommonInfo):
    academy = models.CharField(max_length=20)

    def __str__(self):
        return f'{self.name} (학원: {self.academy}'       
    # 상속받은 자식 클래스에서, 부모 클래스의 Meta 속성을 가지면서 자신만의 속성을 추가하고 싶다면
    # <부모클래스>.Meta를 상속받고, 나머지 필요한 속성들을 정의하도록 한다
    # 아래 경우, 부모로부터 ordering 속성을 상속받는다
    class Meta(CommonInfo.Meta):
        verbose_name = '학생'
        verbose_name_plural = '학생 목록'
        db_table = 'Abstract_Student_Table'

db_table

  • 테이블의 이름을 새로 지정한다.

abstract

  • abstract=True 설정해주면 추상클래스로 설정하는 것이다
  • 추상 클래스는 데이터베이스 테이블이 생성되지 않는다.
  • 상속 받은 자식 클래스는 자동으로 False 처리 되어진다.
  • 상속 받은 그대로 True로 설정되어 진다면 수동적으로 일일히 False값을 설정해줘야 하기 때문에 이러한 귀찮은 일을 없게 하기 위한 일반적인 생각 같다.

ordering

  • ordering은 데이터의 순서 기준을 정해주는 옵션이다.

related_name='%(app_label)s_%(class)s_set'

  • 자식 테이블은 related_name을 물려받아 역참조할 때 부모 클래스로부터 상속받은 여러 자식클래스들 중에 하나를 식별할 수 없기에 이런식으로
    표현 해준다 앞에 app_label은 다른 테이블에서 추상클래스 모델을 사용할 경우를 위해 이어 진 것이다!
profile
testify to the light

0개의 댓글