[Django] 랜덤 추천, 좋아요 가장 많은 게시물 찾기

채린·2023년 9월 1일

랜덤 추천

Post 모델들 중 랜덤으로 5개만 화면에 띄워보자(홈화면에 사용)

views.py
import random

all_posts = Post.objects.all()
ran_size = min(5, len(all_posts))  # 리스트 크기보다 크지 않은 값을 선택
random_posts = random.sample(list(all_posts), ran_size)
for randompost in random_posts:
	if randompost.bookmark.filter(pk=user.id).exists():
		randompost.is_booked=True
random_posts_seri = PostBoxSerializer(random_posts,many=True)

모든 Post를 all_posts에 받아온다
ran_size를 5와 all_posts길이중 작은 것으로 지정. 이 작업이 없으면 아직 더미 데이터 쌓기 전에는 다 가져와도 5개가 안돼서 오류난다.
random을 사용해 임의의 5개를 뽑아준다
5개 post에 대해 현재 사용자가 북마크 했는지 정보를 더해준다.(북마크 표시 색칠 여부를 위해)
시리얼라이저에 넣어준다


랜덤 나이대가 가장 많이 좋아요한 게시물

User필드에 나이대가 1,2,3,4,5로 저장되어 있고, Post에 likes필드는 User를 manytomany필드로 가진다

        random_age = random.randint(1, 5)
        while random_age == user.age:  random_age = random.randint(1, 5)


        # ??나이대가 가장 많이 밑줄그은 Post
        most_liked_post_by_age = Post.objects.annotate(
            age_like_count=Count('line_user', filter=Q(line_user__age=random_age))
        ).order_by('-age_like_count').first()
        
        most_liked_post_by_age = Post.objects.annotate(
            age_like_count=Count('likes', filter=Q(likes__age=random_age))
        ).order_by('-age_like_count').first()

랜덤으로 random_age를 지정, 현재 유저의 나이대와 같다면 다시 뽑는다.
annotate() 함수를 사용하여 기존의 Post 쿼리셋에 새로운 필드 age_like_count를 추가한다.
age_like_count는 random_age에 해당하는 likes 수를 count한 데이터이다.
그리고 age_like_count 필드에 대해 내림차순으로 정렬한다.
first() 함수를 사용하여 가장 좋아요 수가 많은 Post를 가져온다.

0개의 댓글