인코스런 2기
Day3 - 장고 온보딩 프로젝트 3
B1001101
2022. 6. 9. 23:57
학습한 내용
Validation
- https://www.django-rest-framework.org/api-guide/serializers/#validation
- Serializer의 validate() 메소드 작성
- validate() 메소드를 통해 검증된 데이터가 create(), update() 메소드의 validated_data로 전달된다.
Annotate Field
- annotate(): 파생변수 추가할 때 사용
- Aggregation Function
- 종류: Avg, Count, Max, Min, Sum 등
- 하나의 값을 반환
- Coalesce: aggregate가 None을 반환하는 것을 방지
- Subquery
- SQL의 중첩 질의문과 같음
- OuterRef: 바깥 모델에 접근할 때 사용
- https://show-me-the-money.tistory.com/entry/Django-ORM%EC%97%90%EC%84%9C-Subquery-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
from rest_framework import generics
from django.db.models import Subquery, OuterRef, Avg, Count
from django.db.models.functions import Coalesce
from app.movie.models import Movie
from app.review.models import Review
class MovieListCreateView(generics.ListCreateAPIView):
avg_rating_subquery = Review.objects.filter(movie=OuterRef('id')).values('movie').annotate(avg = Avg('rating')).values('avg')
queryset = Movie.objects.annotate(
avg_rating = Coalesce(Subquery(avg_rating_subquery), 0.0)
)