별점(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 구조를 기반으로 현실적인 요구사항을 모델로 구현하는 과정에서, 설계 의도를 명확히 드러내고 성능 및 유지보수 가능성을 고려하는 것이 중요하다는 점을 배웠습니다. 앞으로 다른 모델을 설계할 때도 동일한 접근 방식을 활용해 더 나은 품질의 코드를 작성하고자 합니다.