답변 페이징과 정렬기능 질문 입니다. 3-16

현재 답변 페이징과 추천수,최신순 구현은 하였습니다.
그리고 책에 있는 것처럼 추천수가 가장 많은 답변을 맨 상단에 띄우고 싶은데 막혀서 질문 드립니다.

현재 detail view는 이렇게 구성되어 있습니다.

def detail(request, question_id):

    question = get_object_or_404(Question, pk=question_id)

    page = request.GET.get('page', '1')

    so = request.GET.get('so', 'recent')

    if so == 'recommend':
        answer_list = Answer.objects.filter(question=question).annotate(
            num_voter=Count('voter')).order_by('-num_voter', '-create_date')
    else:
        answer_list = Answer.objects.filter(
            question=question).order_by('-create_date')

    mx_voter_num = Answer.objects.filter(question=question).annotate(num_voter=Count(
        'voter')).aggregate(Max('num_voter'))

    paginator = Paginator(answer_list, 3)
    page_obj = paginator.get_page(page)



    context = {'question': question, 'answer_list': page_obj,
               'page': page, 'so': so, 'mx_voter_num': mx_voter_num}

    return render(request, 'pybo/question_detail.html', context)

현재는 그냥 답변중 최대 추천을 받은 답변의 추천수를 html로 넘겨서 html에서 반복문으로 최대 추천 답변을 걸러내고 있는데 이렇게 하면 효율적이지 않을 것 같다는 생각이 듭니다.

view 부분에서
filter와 annotate와 aggreate를 잘 활용하면 최대 추천을 가진 답변만 뽑아 낼 수 있을것 같은데 도저히 생각이 잘 나지 않습니다.

도움 부탁 드립니다. ㅠㅠ

hhgg 85

2021년 7월 23일 6:02 오후

목록으로
1개의 답변이 있습니다. 1 / 1 Page
mx_voter_num = Answer.objects.filter(question=question).annotate(num_voter=Count(
        'voter')).aggregate(Max('num_voter'))['num_voter__max'] or 0
aa = Answer.objects.annotate(num_voter=Count(
        'voter')).filter(question=question, num_voter=mx_voter_num)

자문 자답입니다.
Max()값이 None 일때 문제가 생겼었는데 이 부분에 or을 사용하면 되더라구요

더 좋은 방법있으면 댓글 꼭 남겨주세요 ㅠ

hhgg

M 2021년 7월 23일 6:26 오후