장고 모델에서 Mixin으로 상속 받았을 때, 필드 이름이 겹쳐도 될까?

소요 시간: 3분

오늘은 Django에서 Mixin을 사용하여 모델을 상속받을 때, 같은 이름의 필드를 오버라이드할 수 있는지에 대해 고민해 보았다. 코드를 작성하다 보니, 필드 이름이 겹치는 상황이 정말 자주 발생할 것 같다는 생각이 들었다. 그래서 이 문제를 좀 더 깊이 탐구해보기로 했다.

먼저 Mixin 클래스에서 필드를 정의하고, 이를 다른 모델에서 상속받는 방식을 살펴보았다. Django에서는 같은 이름의 필드를 오버라이드할 수 있다는 점이 정말 매력적이라는 생각이 들었다. 아래는 그 예시 코드다.

from django.db import models

# Mixin 클래스 정의
class BaseModelMixin(models.Model):
    name = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        abstract = True  # 이 클래스를 DB 테이블로 생성하지 않기 위해 abstract=True를 설정

# 주 모델 클래스 정의
class MyModel(BaseModelMixin):
    # 필드 오버라이드
    name = models.CharField(max_length=200)  # 길이를 200으로 변경

    def __str__(self):
        return self.name

위 코드를 보면서 Mixin에서 정의한 name 필드를 주 모델인 MyModel에서 다시 정의하여 길이를 변경할 수 있다는 점이 매우 유용하다는 생각이 들었다. BaseModelMixin에서 abstract = True를 설정하면 Mixin 자체가 데이터베이스에 테이블로 생성되지 않는다는 점도 매우 중요한 포인트였다. 이렇게 하면 필드 이름이 겹쳐도 문제가 없다는 사실을 깨달았다.

그러나 오버라이드한 필드는 원래 필드를 대체하게 된다. 그래서 MyModel 인스턴스에서 사용할 수 있는 name 필드는 길이가 200인 새로운 필드가 되는 것이다. 이로 인해 공통적인 기능을 갖는 모델을 구성하면서도 각 모델에 맞는 특성을 부여할 수 있다는 점이 정말 좋았다.

오늘의 학습을 통해 Mixin을 효과적으로 활용하면 모델의 재사용성을 높일 수 있다는 것을 확실히 깨달았다. 필드 이름이 겹치는 상황을 두려워할 필요가 없다는 사실에 안도감을 느끼며, 앞으로의 프로젝트에 큰 도움이 될 것이라는 기대감이 생겼다.

장고 리스트