TIL | Django - aggregate

4363 단어 WeCode위코드WeCode

django model에서 랜덤한 데이터 불러와 볼까?

1차 프로젝트를 진행하며 어떤 상품의 상세 정보를 클릭하여 상세 페이지를 보던 도중 관련 상품을 보는 기능이 있길래 '이건 어떻게 구현해야 할까?' 라는 막연한 호기심에 찾아보게 되었다.

예를 들어, 시금치를 구매하기 위해 시금치 상세 페이지에 들어왔을 때 관련 상품으로 김, 브로콜리, 시금치 덮밥 등이 보였다. 관련 상품으로 해당 카테고리의 모든 상품이 뜨는 것이 아니라 몇가지 상품만 디스플레이 되었는데, 물론 추천순, 혹은 조회순으로 나열했을 때 높은 순서로 5~8개만 보여지는 것이겠지만 이걸 해당 카테고리에서 랜덤하게 가져오는 방법을 알고 싶었다.

aggregate

랜덤한 데이터를 가져오기 위해서는 django ORM을 아주 유용하게 만들어주는 aggregate를 알아야 한다.

aggregate : 합계, 집합, 집합체

aggregate는 사전적 의미로 합계, 집합이라는 뜻인데 django에서 컬럼의 총합, 개수, 최대값, 최소값 등을 알려준다.

from django.db.models import Sum

'''
+----------+----------+
|id	   |price     |
|----------+----------|
|1	   |2000      |
|2	   |5000      |
|3	   |1500      |
+----------+----------+
'''

products_query_set.aggregate(total_price = Sum('price'))
#{'total_price' : 8500}

이번엔 Max를 가져와 보자.

from django.db.models import Max

'''
+----------+----------+
|id	   |price     |
|----------+----------|
|1	   |2000      |
|2	   |5000      |
|3	   |1500      |
+----------+----------+
'''

products_query_set.aggregate(max_price = Max('price'))
#{'max_price' : 5000}

이런 식으로 데이터들을 핸들링할 수 있다. 이걸 이용하여 랜덤한 데이터를 불러와 보자.

import random

from django.db.models import Max

def Get_random_data():
    max_id = products.aggregate(max_id = Max('id'))['max_id']
    #중간에 id가 삭제된 경우 고려하여 id가 존재하는 경우만 로직을 수행해 준다.
    while True:
         pk = random.randint(1, max_id)
         product = Product.objects.filter(pk = pk).first()
         if product:
             return product

좋은 웹페이지 즐겨찾기