관리 메뉴

Storage Gonie

Django (20*) images앱의 Image, Comment 모델 생성(Abstract base class 이용) 본문

웹개발/인스타 클론 (1) Django

Django (20*) images앱의 Image, Comment 모델 생성(Abstract base class 이용)

Storage Gonie 2019. 6. 27. 01:58
반응형

# Abstract base class 란 무엇인가

- Abstract base class 는 모델이기는 하지만, 데이터베이스 테이블을 생성하지 않으며,
   공통된 field를 자식한테 물려주는 목적으로 사용된다. 즉, 중복 코딩을 제거하기 위해 사용함.
- django.db.models.Model 을 상속받아 만들어지는 모델이며(단, 테이블 생성X),
   다른 클래스들이 공통적으로 가지게할 field를 정의한 뒤,   
   Abstract base class 임을 구분하기 위해 내부에 Meta class를 정의하고 거기에 abstract = True를 넣어줘야 한다.
   (Meta 클래스에는 부가적인 설명 정보가 들어간다. 여기에 적는 것은 field가 아님)

- 이전 장에서 User 모델을 만들 때 사용된 AbstractUser도 바로 이 abstract base class의 일종이다.

 

# Abstract base class 를 이용해 Image, Comment 클래스 정의하기
- User 모델에 필드를 추가할 때 null=True 속성을 줬었는데, 여기서는 이게 필요없다.

   null=True 속성을 이전에 사용했던 이유는 User 모델에 필드를 추가하기 전에 테이블에 데이터가 존재해서 그런거였는데,
   여기서는 이제 처음 만들어질 테이블이기 때문에 데이터가 없어서 필요없는 속성이다.

from django.db import models


class TimeStampedModel(models.Model):

    created_at = models.DateTimeField(auto_now_add=True)  # 모델이 생성된 날짜, 테이블이 생성될 때 현재 시간이 저장되도록 하는 속성.
    updated_at = models.DateTimeField(auto_now=True)      # 모델이 업데이트 된 날, 테이블이 업데이트 되었을 때 현재 시간이 저장되도록 하는 속성.

    class Meta:
        abstract = True  # abstract base class 임을 알림


class Image(TimeStampedModel):

    file = models.ImageField()                   # 이미지파일
    location = models.CharField(max_length=140)  # 촬영한 위치
    caption = models.TextField()                 # 이미지에 대한 설명


class Comment(TimeStampedModel):

    message = models.TextField()                 # 댓글 텍스트

 

# 정의한 모델 DB에 반영시키기

python manage.py runserver  # 코드상에 오류가 없는지 실행을 통해 먼저 확인
python manage.py makemigrations
python manage.py migrate

 

반응형
Comments