[TIL #53] 최종프로젝트 #2 AttributeError, related_name

안떽왕·2023년 6월 8일
0

Today I Learned

목록 보기
55/76

오늘은 팀원들과 프로젝트 기획을 한 이후 본격적으로 개발을 하는 시간을 가졌습니다.

함께 만든 erd와 api명세를 가지고 모델과 시리얼라이저, views를 작성해 나갔습니다.

그리고 오늘있었던 소소한 오류를 소개하고자 합니다.

AttributeError: 'Routes' object has no attribute 'rate'

오늘 만난 에러는 정말 흔하게 볼 수있는 에러인AttributeError로 속성 이름이 잘못됐거나 없을 때 주로 나타납니다.

사실 이 에러가 나왔을 때만해도 금방 고쳐지겠지 라고 생각하며 에러를 잡으러 갔습니다.

에러가 나왔던 부분은

# serializers.py
class RouteSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()
    comment_count = serializers.SerializerMethodField()
    rate = serializers.SerializerMethodField()
    destinations = DestinationSerializer(many=True)
    places = PlaceSerializer(many=True)

    def get_user(self, obj):
        return {'id': obj.user.pk, 'nickname': obj.user.nickname}

    def get_comment_count(self, obj):
        return obj.comments.count()

    def get_rate(self, obj):
        rate_avg = obj.rate.aggregate(average=Avg('rate'))['average']
        return rate_avg

    class Meta:
        model = Routes
        fields = "__all__"

이 시리얼라이저에 있는

def get_rate(self, obj):
    rate_avg = obj.rate.aggregate(average=Avg('rate'))['average']
    return rate_avg

이 부분입니다.

처음에는 Routes라는 모델안에 rate 속성이 없다고 에러가 나왔는데 사실 Routes안에는 rate가 안들어가게 설계를 했기에 당연한 말이였습니다.

하지만 다른 모델에서 가져온 값들은 아무 이상없이 잘 돌아가는데 어째서 rate만 이런 현상이 나는지 한참을 찾아보다가 회의시간이 되어 회의 중 이 에러에 대해 팀원들과 대화를 하게 되었고 이유를 찾을 수 있게 되었습니다.

class RouteRate(models.Model):
    route = models.ForeignKey(Routes, verbose_name="경로", on_delete=models.CASCADE, related_name="rating")
    user = models.ForeignKey(User, verbose_name="작성자", on_delete=models.CASCADE, related_name="route_rating")
    rate = models.IntegerField("평가")

네 정답은 바로 related_name을 잘못 적은 것 이였습니다...

너무너무 원초적인 실수를 했네요 rate만 적어왔는데 왜 related_name을 적을때만 rating을 적은건지 저도 모르겠습니다..

Routes 모델에 너무 매몰되다보니 원래 rate의 주인인 RouteRate 모델을 제대로 살펴보지 않은게 패착이였습니다.

차례대로 거슬러 올라갔다면 금방 해결할 수 있던 문제였는데 에러코드만 보고 해당 모델만 쥐잡듯이 잡았네요... 담부턴 주의하도록 하겠습니다.

profile
이제 막 개발 배우는 코린이

0개의 댓글