답변 페이징과 정렬기능 질문 입니다. 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 님 641
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 오후