강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

오동통 삽겹살님의 프로필 이미지
오동통 삽겹살

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

QuerySet 메소드 aggregate() 활용에 대하여

해결된 질문

작성

·

221

2

강사님 안녕하세요~
QuerySet 메소드 중 aggregate()를 활용하는데 어려움이 있어서 도움을 요청드립니다.

aggregate()를 활용하여 QuerySet 내 모델 객체에 대한 다양한 집계결과를 하나의 JSON 객체로 반환하고 싶습니다.

다음과 같이 응답을 주고 싶습니다.
{
"total_count": 3,
"estrus_count": 2,
"pregnancy_count": 0
}

문제는 aggregate()의 반환값이 모델로 구성된 QuerySet이 아니라 Dictionary이기 때문에 viewset의 aggregate()로 처리된 값을 Serializer에서 받아서 JSON으로 반환할 때 관련 에러가 계속 발생합니다.

viewset에서 aggregate로 작업한 결과를 받아서 serializer에서 의도한대로 하나의 JSON 객체로 반환할 수 있는 방법이 있을까요?

Model, Serializer, ViewSet에 대한 코드는 아래와 같습니다.

class DogStatusCountViewSet(viewsets.ModelViewSet):
serializer_class = DogStatusCountSerializer
http_method_names = ['get', ]
ordering_fields = '__all__'

def get_queryset(self):
queryset = super().get_queryset()

return queryset.aggregate(
total_count=Count('id'),
estrus_count=Count('id', filter=Q(current_status='estrus')),
pregnancy_count=Count('id', filter=Q(current_status='pregnancy'))
)
class DogStatusCountSerializer(serializers.Serializer):
total_count = serializers.IntegerField(read_only=True)
estrus_count = serializers.IntegerField(read_only=True)
pregnancy_count = serializers.IntegerField(read_only=True)
class Dog(models.Model):
current_status = models.CharField(max_length=64, default='estrus')

class Meta:
managed = True
db_table = 'dog'
ordering = ['-id']
 
감사합니다
 
 
 
 

답변 1

1

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

말씀하신 경우는 ModelViewSet에서 지원하는 일반적인 CRUD가 아니라, 예외적인 케이스이므로 ModelViewSet으로 구현하시기 보다, 함수 뷰로서 구현하시는 것이 더 나을 듯 합니다.

DRF에는 @api_view 장식자가 있어서, 함수 뷰의 경우에도 DRF의 지원을 받을 수 있습니다.

https://www.django-rest-framework.org/api-guide/views/#api_view

함수 뷰로 구현하시고, Serializer는 굳이 적용하지 마시고, aggregate를 받아서 DRF의 Response로 응답을 하도록 구현해보시면 어떨까요?

답변 감사합니다.
강사님의 답변을 들으니 제 생각이 너무 DRF의 ModelViewSet에 묶여있던 것 같습니다.

덕분에 깨우쳤습니다.

감사합니다~

이진석님의 프로필 이미지
이진석
지식공유자

화이팅입니다~!!!  ;-)

오동통 삽겹살님의 프로필 이미지
오동통 삽겹살

작성한 질문수

질문하기