별점(score) 모델 필드 설정 참고 :DecimalField
오늘은 Django를 활용해 Review 모델을 설계하며, 의사결정 과정과 주요 고려사항을 기록했습니다. ERD 구조를 기반으로 현실적인 요구사항과 비즈니스 로직을 모델링하는 데 중점을 두었고, 각 필드와 메서드가 어떤 이유로 설계되었는지 체계적으로 정리했습니다.
ERD에 따라 Review는 다음과 같은 관계를 가지고 있었습니다:
User
와 Many-to-One 관계 (리뷰 작성자는 한 명의 유저)ReviewComment
와 One-to-Many 관계 (하나의 리뷰에 여러 댓글 가능)ReviewLike
와 One-to-Many 관계 (하나의 리뷰에 여러 좋아요/비추천 가능)이 구조를 Django ORM으로 옮기면서 ForeignKey
와 related_name
을 활용해 연관 관계를 명확히 표현했습니다.
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="reviews"
)
SET_NULL
사용.related_name
설정으로 유저 객체에서 리뷰를 쉽게 참조 (user.reviews
).content = models.TextField()
TextField
사용.app_id
):app_id = models.IntegerField()
score
):score = models.DecimalField(max_digits=2, decimal_places=1, default=1.0)
0.5
단위로, 최대값이 5.0
인 점을 고려해 DecimalField
선택.Decimal
사용.total_likes
, total_dislikes
):total_likes = models.IntegerField(default=0)
total_dislikes = models.IntegerField(default=0)
update_likes_and_dislikes
메서드:def update_likes_and_dislikes(self):
self.total_likes = self.likes.filter(is_active=1).count()
self.total_dislikes = self.likes.filter(is_active=-1).count()
self.save()
ReviewLike
모델의 is_active
필드로 관리.__str__
메서드:def __str__(self):
if self.user:
nickname = self.user.nickname
else:
nickname = "알수없음"
return f"Review 작성자 : {nickname} - 스팀 게임 번호 : {self.app_id} 평점 : ({self.score})"
class Meta:
ordering = ["-created_at"]
ReviewLike
모델에서 is_active
필드를 활용해 중립(0), 좋아요(1), 비추천(-1) 상태를 관리.app_id
필드를 통해 외부 API(예: Steam)와 쉽게 통합 가능.이번 설계를 통해 ERD 구조를 기반으로 현실적인 요구사항을 모델로 구현하는 과정에서, 설계 의도를 명확히 드러내고 성능 및 유지보수 가능성을 고려하는 것이 중요하다는 점을 배웠습니다. 앞으로 다른 모델을 설계할 때도 동일한 접근 방식을 활용해 더 나은 품질의 코드를 작성하고자 합니다.