해당 글은 Django 공식 문서의 Models - Model Inheritance 내용을 번역 및 정리한 내용입니다.
모델을 잘 설계하기 위해서는 모델의 관계들을 잘 이해할뿐만 아니라, 모델의 3가지 상속 방법을 알고 이를 적절한 case에 이용할 수 있어야 합니다.
django.db.models.Model
을 상속받아야 합니다.abstract = True
추가# velog/inheritances/models.py
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)
name
, age
, home_group
세가지 필드 존재추상 기본 클래스가 생성되면 Django는 기본 클래스에서 선언한 Meta 내부 클래스를 속성으로 사용할 수 있도록 합니다.
자식 클래스가 자신의 Meta 클래스를 선언하지 않으면 부모 클래스의 Meta를 상속받습니다.
from django.db import models
class CommonInfo(models.Model):
name = models.CharField(max_length=100)
age = models.PositiveIntegerField()
class Meta:
abstract = True
ordering = ['name']
class Student(CommonInfo):
home_group = models.CharField(max_length=5)
class Meta:
db_table = 'student_info'
abstract
속성값을 False
로 설정 (추상 기본 클래스 자식은 자동으로 추상 클래스가 되지 X)abstract = True
를 명시적으로 설정하면 다른 추상 기본 클래스에서 상속받은 추상 기본 클래스 생성 가능ForeignKey 또는 ManyToManyField에서 related_name
또는 related_query_name
사용하는 경우
related_name
또는 related_query_name
속성값 동일%(app_label)s
및 %(class)s
포함%(app_label)s
: 하위 클래스가 포함된 앱 이름의 lower-cased 이름%(class)s
: 필드가 사용되는 하위 클래스의 lower-cased 이름# velog/common/models.py
from django.db import models
class OtherModel(models.Model):
pass
class Base(models.Model):
m2m = models.ManyToManyField(OtherModel)
class Meta:
abstract = True
class ChildA(Base):
pass
class ChildB(Base):
pass
related_name
속성을 지정하지 않으면, common.ChildA.m2m
필드와 common.ChildB.m2m
필드의 reverse name은 각각 childa_set
, childb_set
# ...
class Base(models.Model):
m2m = models.ManyToManyField(
OtherModel,
# related_name, related_query_name 지정
related_name='%(app_label)s_%(class)s_related',
related_query_name='%(app_label)s_%(class)ss',
)
class Meta:
abstract = True
# ...
common.ChildA.m2m
필드와 common.ChildB.m2m
필드의 reverse name은 각각 common_childa_related
, common_childb_related
common.ChildA.m2m
필드와 common.ChildB.m2m
필드의 reverse query name은 각각 common_childas
, common_childbs