상속을 위한 모델 구성방법

2024. 10. 31. 09:06django/Model

이 경우에는 `Category` 모델을 상속받아 각 앱에 맞는 구현을 하는 것이 좋습니다. 이를 통해 코드 중복을 최소화하고 각 앱의 요구사항에 맞는 확장이 가능합니다.

예를 들어, `plans` 앱과 `boader` 앱에서 사용하는 `Category` 모델이 다르다면 다음과 같이 구현할 수 있습니다:

1. `categories/models.py`:
   ```python
   from django.db import models

   class BaseCategory(models.Model):
       name = models.CharField(max_length=50)
       slug = models.SlugField(unique=True)

       def __str__(self):
           return self.name

       class Meta:
           abstract = True
   ```

2. `plans/models.py`:
   ```python
   from django.db import models
   from django.contrib.auth import get_user_model
   from categories.models import BaseCategory

   User = get_user_model()

   class PlanCategory(BaseCategory):
       # plans 앱에 특화된 필드 추가 가능
       plan_type = models.CharField(max_length=20, choices=PLAN_TYPES, default='free')

   class Plan(models.Model):
       PLAN_TYPES = (
           ('free', 'Free'),
           ('basic', 'Basic'),
           ('pro', 'Pro'),
           ('enterprise', 'Enterprise'),
       )

       user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='plans')
       title = models.CharField(max_length=100)
       description = models.TextField()
       category = models.ForeignKey(PlanCategory, on_delete=models.CASCADE, related_name='plans')
       # ... 나머지 필드들
   ```

3. `boader/models.py`:
   ```python
   from django.db import models
   from categories.models import BaseCategory

   class BoardCategory(BaseCategory):
       # boader 앱에 특화된 필드 추가 가능
       is_active = models.BooleanField(default=True)

   class Board(models.Model):
       title = models.CharField(max_length=100)
       content = models.TextField()
       category = models.ForeignKey(BoardCategory, on_delete=models.CASCADE, related_name='boards')
       # ... 나머지 필드들
   ```

이렇게 구현하면 다음과 같은 장점이 있습니다:

1. `BaseCategory` 모델에 공통 필드를 정의하여 코드 중복을 방지합니다.
2. `PlanCategory`와 `BoardCategory`에서 각 앱의 요구사항에 맞는 추가 필드를 정의할 수 있습니다.
3. 각 앱에서는 자신의 `Category` 모델을 사용하므로, 다른 앱의 `Category` 모델에 의존하지 않습니다.
4. 필요한 경우 `BaseCategory` 모델을 확장하여 새로운 `Category` 모델을 만들 수 있습니다.

이러한 구조를 통해 `Category` 모델의 확장성과 유지보수성을 높일 수 있습니다.