from django.db.models import Sum
from rest_framework import serializers
from .models import Equipment, Park, ParkEquipment, Review
[문서]class EquipmentSerializer(serializers.ModelSerializer):
"""
공원 시설
"""
[문서]class ParkEquipmentSerializer(serializers.ModelSerializer):
equipment_name = serializers.CharField(source="equipment_id.equipment_name")
[문서]class ParkSerializer(serializers.ModelSerializer):
"""
공원 정보
"""
total_equipments = serializers.SerializerMethodField()
equipments = ParkEquipmentSerializer(source="park_equipments", many=True)
avg_score = serializers.SerializerMethodField()
total_reviews = serializers.SerializerMethodField()
# MEMO: SerializerMethodField를 구현한 경우 메소드에
# 반환 타입힌트를 명시해야 swagger 에서 정상적으로 타입이 표시됩니다
[문서] def get_total_equipments(self, obj) -> int:
sum_of_quantity = ParkEquipment.objects.filter(park_id=obj.id).aggregate(
Sum("quantity", default=0)
)["quantity__sum"]
return sum_of_quantity
[문서] def get_avg_score(self, obj) -> float:
return obj.average_rating
[문서] def get_total_reviews(self, obj) -> float:
return obj.count_reviews
[문서]class ParkNearbyListSerializer(serializers.ModelSerializer):
"""
공원 정보
"""
parks = ParkSerializer(source="nearby_parks", many=True)
[문서]class ParkReviewSerializer(serializers.ModelSerializer):
"""
공원 리뷰 조회, 생성, 수정
"""
username = serializers.CharField(source="user_id.username", read_only=True)
parkname = serializers.CharField(source="park_id.park_name", read_only=True)