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를 앞에 작성해준다.
from django.apps import AppConfig
class AbstractConfig(AppConfig):
name = 'inheritance.abstract'
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
설정해주면 추상클래스로 설정하는 것이다ordering
related_name='%(app_label)s_%(class)s_set'