상속을 위한 모델 구성방법
2024. 10. 31. 09:06ㆍdjango/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` 모델의 확장성과 유지보수성을 높일 수 있습니다.
'django > Model' 카테고리의 다른 글
MSSQL의 데이터베이스 테이블을 Django 모델로 변환하는 방법 (0) | 2024.11.27 |
---|---|
데이터베이스 설계를 하기 위해서 (1) | 2024.11.14 |
class User(AbstractUser) 사용시 ForeignKey 사용법 (0) | 2024.10.30 |
todo = Todo.objects.all() serializer = TodoSerializer(todo, many=True) (0) | 2024.01.31 |
from django.contrib.auth.models import AbstractUser 에서 상속받아 class User 를 만들었다. 이메일번호를 받아서 calss User에서 검색을 할려면 (0) | 2023.04.12 |