[Django] 자주 사용하는 필드 분리

오제욱·2023년 2월 20일
1
post-thumbnail

1. Django의 모델

Django는 SQL문이 아닌 내장 ORM을 통해 데이터베이스에 접근한다.

ORM이란?
Object Relational Mapping 의 약자로 객체와 관계형 데이터베이스를 매핑 해 주는 것을 의미한다.

Django 프로젝트 안에 models.py 에서 작성한 class 하나는 데이터베이스의 테이블과 매핑된다.
model 클래스 안에 설정한 필드들은 데이터베이스에서 1개의 row로 반영된다.

또한 Django 에서는 이 ORM 을 통해 데이터 베이스에 추가, 수정, 삭제, 읽기(CRUD) 의 기능을 구현할 수 있다.

2. Model의 작성

다음과 같이 모델이 Article Comment 각각 게시물과 댓글에 대한 모델이 있다고 하자.

from django.db import models
from django.contrib.auth.models import User


class Article(models.Model):

    """Article Model Definition"""

    title = models.CharField(max_length=200)
    content = models.TextField(blank=True)
    writer = models.ForeignKey(
        "auth.User", related_name="articles", on_delete=models.SET_NULL, null=True
    )
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title


class Comment(models.Model):

    """Article Model Definition"""

    content = content = models.TextField(blank=True)
    writer = models.ForeignKey(
        "auth.User", related_name="comments", on_delete=models.SET_NULL, null=True
    )
    article = models.ForeignKey("article.Article", related_name="comments", on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.article

위의 모델에서 보게되면 created_at updated_at 필드가 중복적으로 들어가게 된다.
두 필드는 게시물과 댓글 외에도 다른 모델에서 자주 사용하는 필드이므로 매번 모델에 정의하기 보다는 별도로 분리해서 사용하는 것이 편리하다.

3. 자주 사용하는 필드의 분리

필드의 분리를 위해 자주 공통적으로 사용하는 것들을 분리하는 용도의 common앱을 생성한다.

python manage.py startapp common

common app의 models.py로 이동해서 분리해 줄 필드를 별도의 모델로 정의한다.

# common/models.py

from django.db import models


class CommonModel(models.Model):
    """Common Model Definition"""

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

이렇게 별도의 모델로 분리한 필드들을 기존의 모델에서 사용하기 위해서 적용하려고 하는 모델에서 해당 모델을 상속받아 사용한다.

from django.db import models
from django.contrib.auth.models import User
from common.models import CommonModel # CommonModel 불러오기


class Article(CommonModel): # CommonModel 상속

    """Article Model Definition"""

    title = models.CharField(max_length=200)
    content = models.TextField(blank=True)
    writer = models.ForeignKey(
        "auth.User", related_name="articles", on_delete=models.SET_NULL, null=True
    )
    
	# created_at, updated_at 필드가 삭제 되어도 CommonModel을 상속 받기 때문에 적용된다. 
    
    def __str__(self):
        return self.title


class Comment(CommonModel):

    """Article Model Definition"""

    content = content = models.TextField(blank=True)
    writer = models.ForeignKey(
        "auth.User", related_name="comments", on_delete=models.SET_NULL, null=True
    )
    article = models.ForeignKey("article.Article", related_name="comments", on_delete=models.CASCADE)
    
    # created_at, updated_at 필드가 삭제 되어도 CommonModel을 상속 받기 때문에 적용된다.

    def __str__(self):
        return self.article

이렇게 모델을 작성해도 기존과 같이 분리된 필드들이 잘 적용 되어 있다.

4. 결론

작은 프로젝트에서는 큰 필요성을 느끼지 못할 수 있지만 프로젝트의 규모가 커질 수록 자주 사용하거나 반복적으로 쓰이는 내용은 별도로 분리해서 적용하는 것이 바람직하다.

profile
Django Python 개발자

1개의 댓글

comment-user-thumbnail
2023년 3월 8일

참고 잘 하겠습니다 ㅎㅎ

답글 달기