2018-06-19 TIL (Inheritance)

Meta options

테이블 전체에 대한 옵션. 정렬 또는 테이블 이름 등을 지정할 수 있다.

Inheritance

장고는 세가지 방법의 상속을 제공함

  1. 부모 클래스를 사용하여 하위 모델의 필드를 일일이 입력하지 않게 함 –> Abstract base classes

  2. 기존 모델을 subclass로 만들고 각 모델이 자체 DB를 가지려면 –> Multi table

  3. DB는 안건드리고 파이썬 레벨 동작만 수정하는 경우 –> Proxy

Abstract base classes

Reverse accessor과 Reverse query name

class RelatedUser(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name

class PostBase(models.Model):
    author = models.ForeignKey(
        RelatedUser,
        on_delete=models.CASCADE,
        related_name='posts',

    )
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        abstract = True

class PhotoPost(PostBase):
    photo_url = models.CharField(max_length=500)

class TextPost(PostBase):
    text = models.TextField()

위 모델을 적고 makemigrations를 하면 다음과 같은 에러가 뜬다.

2018-06-19 10 44 49

필드에러 304번(Reverse accessor), 305번(Reverse query name).

Reverse accessor는 manager를 말함. 역으로 DB에 참조할 수 있도록 도와주는 매니저. related_name = ‘posts’로 설정한 그것.

PostBase에서 author로 가는 것은 정방향이라면 RelatedUser에서 자기 자신을 참조하는 것은 역방향.

proxy

데이터베이스 테이블이 만들어지지 않는다 프록시는 편의성 때문에 쓰지만 실수하지 않기 위해서도 쓴다(?)

Comments