3-12 추천 기능 추가하기 - [1] 질문 목록에 추천수 표시하기 count함수 질문
아래의 코드에서 question.voter.all.count로 카운트를 세는데
왜 question.voter.count이 아니라 question.voter.all.count인가요?
question.answer_set.count에는 all이 없는데 궁금합니다.
코드
<td>
{% if question.voter.all.count > 0 %}
<span class="badge badge-warning px-2 py-1">{{ question.voter.all.count }}</span>
{% endif %}
</td>
<td class="text-left">
<a href="{% url 'pybo:detail' question.id %}">{{question.subject}}</a>
{% if question.answer_set.count > 0 %}
<span class="text-danger small ml-2">{{ question.answer_set.count }}</span>
{% endif %}
</td>
<질문2 코드 (question_detail.html)>
div class="col-1"> <!-- 추천 영역 -->
<div class="bg-light text-center p-3 border font-weight-bolder mb-1">{{ question.voter.count }}</div>
<a href="#" data-uri="{% url 'pybo:vote_question' question.id %}"
class="recommend btn btn-sm btn-secondary btn-block my-1">いいね</a>
</div>
HJ 님 550
M 2021년 7월 21일 9:05 오후
2개의 답변이 있습니다. 1 / 1 Page
question.voter 는 manytomany 필드로 count 함수를 사용할 수 없습니다.
반면 question.answer_set 이나 question.voter.all 은 count 함수를 사용할 수 있습니다.
[위의 내용 수정]
question.voter 는 manytomany 필드로 count 함수를 사용할 수 있습니다.
그리고 question.answer_set 이나 question.voter.all 도 count 함수를 사용할 수 있습니다.
박응용 님
M 2021년 7월 22일 1:33 오전
궁금하신 voter.count() 와 voter.all().count() 쿼리 비교 방법입니다.
>>> from pybo.models import Question
>>> from django.conf import settings
>>> settings.DEBUG = True
>>> from django.db import connection
>>> q = Question.objects.get(id=4)
>>> q.voter.count()
9
>>> connection.queries[-1]
{'sql': 'SELECT COUNT(*) AS "__count" FROM "common_customuser" INNER JOIN "pybo_question_voter" ON ("common_customuser"."id" = "pybo_question_voter"."customuser_id") WHERE "pybo_question_voter"."question_id" = 4', 'time': '0.001'}
>>> q.voter.all().count()
9
>>> connection.queries[-1]
{'sql': 'SELECT COUNT(*) AS "__count" FROM "common_customuser" INNER JOIN "pybo_question_voter" ON ("common_customuser"."id" = "pybo_question_voter"."customuser_id") WHERE "pybo_question_voter"."question_id" = 4', 'time': '0.001'}
테스트 해 보니 voter.count() 와 voter.all().count() 두개가 모두 동일한 쿼리를 사용하네요.
박응용 님
2021년 7월 22일 7:07 오후