Model Inheritance
- Python์ ํด๋์ค ์์๊ณผ ์๋ํ๋ ๋ฐฉ์์ด ๊ฑฐ์ ๋์ผ
- ๋ฐ๋์ ๋ฐ๋ผ์ผํ๋ ๊ธฐ๋ณธ ์ฌํญ 2๊ฐ์ง
- ๊ธฐ๋ณธ ํด๋์ค๊ฐ
django.db.models.Model
์ ์์๋ฐ์์ผ ํจ
- ๋ถ๋ชจ model์ด ์์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ๊ฐ๋ model์ด ๋ ์ง, ๋ถ๋ชจ๊ฐ ์์ model์๊ฒ ์ ๋ฌํ ์ ๋ณด๋ง ๊ฐ๊ณ ์๋์ง ์ฌ๋ถ๋ง ์ ํ๋ฉด ๋จ
๋ชจ๋ธ ์์ 3๊ฐ์ง ๋ฐฉ๋ฒ
- ์ถ์ ๊ธฐ๋ณธ ํด๋์ค(Abstract base classes): ๋ถ๋ชจ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ํ์ model์ ๋ํด ์ผ์ผ์ด ์
๋ ฅํ์ง ์์ผ๋ ค๋ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ฒฝ์ฐ
- ํด๋์ค๋ฅผ ๋ฐ๋ก ๋ถ๋ฆฌํ์ฌ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ, ๊ฐ์ฅ ์ผ๋ฐ์
- ๋ค์ค ํ
์ด๋ธ ์์(Multi table inheritance): ๊ธฐ์กด model์ ํ์ ํด๋์คํํ๊ณ , ๊ฐ model์ด ์์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ๊ฐ๊ธฐ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ
- ํ๋ก์ ๋ชจ๋ธ(Proxy model): model ํ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ model์ python ์์ค ๋์๋ง ์์ ํ๋ ค๋ ๊ฒฝ์ฐ
์ถ์ ๊ธฐ๋ณธ ํด๋์ค
- ๋ช ๊ฐ์ง ๊ณตํต๋ ์ ๋ณด๋ฅผ ์ฌ๋ฌ ๋ค๋ฅธ model์ ๋ฃ์ผ๋ ค ํ ๋ ์ ์ฉ
- ๊ธฐ๋ณธ ํด๋์ค๋ฅผ ์์ฑํ๊ณ
Meta class
์ abstract=True
๋ฃ์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋์ง ์๋ ๋์ , ๋ค๋ฅธ model์ ๊ธฐ๋ณธ ํด๋์ค๋ก ์ฌ์ฉ๋ ๋ ํด๋น ํ๋๋ ์์ ํด๋์ค์ ํ๋์ ์ถ๊ฐ๋จ
- ์์์ ์ด๋ฆ๊ณผ ๊ฐ์ ์ด๋ฆ(์์ ๋ฐ์ ํด๋์ค์ ์ด๋ฆ๊ณผ ๊ฐ์ ์ด๋ฆ์ ํ๋)์ ๊ฐ์ง ์ถ์ ๊ธฐ๋ณธ ํด๋์ค์ ํ๋๋ฅผ ๊ฐ์ง ์ ์์
- Python ๋ ๋ฒจ์์ ๊ณตํต ์ ๋ณด๋ฅผ ์ ์ธ์ํค๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ฉด์, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ๋ฒจ์์ ํ์ model ๋น ํ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ๋ง ์์ฑ
- ๊ธฐ๋ณธ ํด๋์ค๊ฐ ์์ฒด์ ์ผ๋ก ์กด์ฌํ์ง ์์
from django.db import models
class CommonInfo(models.Model):
name = models.CharField(max_length=100)
age = models.PositiveIntegerField()
class Meta:
abstract = True
class Student(CommonInfo):
home_group = models.CharField(max_length=5)
Student model
- name, age, home_group ์ธ ๊ฐ์ง ํ๋ ์กด์ฌ
CommonInfo model
- ์ผ๋ฐ django model๋ก ์ฌ์ฉ ๋ถ๊ฐ๋ฅ
- manager๋ฅผ ๊ฐ์ง์ง ์์
- ์ง์ ์ธ์คํด์คํํ๊ฑฐ๋ ์ ์ฅ ๋ถ๊ฐ๋ฅ
- Meta inheritance
- ์ถ์ ๊ธฐ๋ณธ ํด๋์ค๊ฐ ์์ฑ๋๋ฉด django๋ ๊ธฐ๋ณธ ํด๋์ค์์ ์ ์ธํ Meta ๋ด๋ถ ํด๋์ค๋ฅผ ์์ฑ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ํจ
- ์์ ํด๋์ค๊ฐ ์์ ์ Meta ํด๋์ค๋ฅผ ์ ์ธํ์ง ์์ผ๋ฉด ๋ถ๋ชจ ํด๋์ค์ Meta๋ฅผ ์์๋ฐ์
from django.db import models
class CommonInfo(models.Model):
class Meta:
abstract = True
ordering = ['name']
class Student(CommonInfo):
class Meta(CommonInfo.Meta):
db_table = 'student_info'
- django๋ ์ถ์ ๊ธฐ๋ณธ ํด๋์ค์ Meta ํด๋์ค๋ฅผ ์กฐ์
- Meta ์์ฑ์ ์ ์ฉํ๊ธฐ ์ ์ abstract ์์ฑ๊ฐ์ False๋ก ์ค์ (์ถ์ ๊ธฐ๋ณธ ํด๋์ค์ ์์์ ์๋์ผ๋ก ์ถ์ ํด๋์ค๊ฐ ๋์ง ์์)
- ๋งค๋ฒ
abstract = True
๋ฅผ ๋ช
์์ ์ผ๋ก ์ค์ ํ๋ฉด, ๋ค๋ฅธ ์ถ์ ๊ธฐ๋ณธ ํด๋์ค์์ ์์๋ฐ์ ์ถ์ ๊ธฐ๋ณธ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์์
๋ค์ค ํ
์ด๋ธ ์์
- ๊ณ์ธต ๊ตฌ์กฐ์ ๊ฐ model์ด ๋ชจ๋ ๊ฐ๊ฐ ์์ ์ ๋ํ๋ด๋ model์ธ ๊ฒฝ์ฐ
- ๊ฐ model์ ์์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ํด๋น, ๊ฐ๋ณ์ ์ผ๋ก ์ฟผ๋ฆฌ ๋ฐ ์์ฑ ๊ฐ๋ฅ
from django.db import models
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
class Restaurant(Place):
serves_hot_dogs = models.BooleanField(default=False)
serves_pizza = models.BooleanField(default=False)
place_ptr = models.OneToOneField(
Place, on_delete=models.CASCADE,
parent_link=True,
primary_key=True,
)
Restaurant
์์ parent_link=True
๋ฅผ ์ฌ์ฉํด ์์ ์ OneToOneField๋ฅผ ์ง์ ์ ์ธํ์ฌ ํด๋น ํ๋ ์ฌ์ ์ ๊ฐ๋ฅ
ํ๋ก์ ๋ชจ๋ธ
- model์ python์์ ๋์๋ง ๋ณ๊ฒฝํ๊ณ ์ ํ ๊ฒฝ์ฐ
- ๊ธฐ๋ณธ ๊ด๋ฆฌ์ ๋ณ๊ฒฝ
- ์ ๋ฉ์๋ ์ถ๊ฐ
- proxy model ์์
- ์๋ model์ ๋ํ proxy๋ฅผ ๋ง๋ฆ
- proxy model์ ์ธ์คํด์ค๋ฅผ ์์ฑ, ์ญ์ , ์
๋ฐ์ดํธ
- ์๋ณธ(๋น proxy) model์ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋จ
- ์๋ณธ ๋ณ๊ฒฝํ์ง ์๊ณ proxy์ ๊ธฐ๋ณธ model ์์(ordering)๋ ๊ธฐ๋ณธ ๊ด๋ฆฌ์(default manager) ๋ฑ ๋ณ๊ฒฝ ๊ฐ๋ฅ
- proxy model
- ์ผ๋ฐ model์ฒ๋ผ ์ ์ธ
- django์๊ฒ meta ํด๋์ค์ proxy ์์ฑ์ True๋ก ์ค์ ํด proxy model์์ ์๋ฆผ
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class MyPerson(Person):
class Meta:
proxy = True
def do_something(self):
pass