오늘은 팀원들과 프로젝트 기획을 한 이후 본격적으로 개발을 하는 시간을 가졌습니다.
함께 만든 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 모델을 제대로 살펴보지 않은게 패착이였습니다.
차례대로 거슬러 올라갔다면 금방 해결할 수 있던 문제였는데 에러코드만 보고 해당 모델만 쥐잡듯이 잡았네요... 담부턴 주의하도록 하겠습니다.