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 536

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 오전

@박응용님 차이점은 없는건가요? all같은 경우는 쿼리셋 객체를, 그냥 all이 없는 voter manyrelatedmanager객체던데 count를 사용하는건 어느쪽을 사용해도 괜찮은건지요? - HJ님, 2021년 7월 22일 9:46 오전 추천 , 대댓글
@박응용님 감사합니다! - HJ님, 2021년 7월 22일 9:46 오전 추천 , 대댓글
@HJ님 내부적으로 어떻게 동작하는지는 좀 살펴봐야 할 것 같구요, 간단하게는 실제 실행되는 쿼리를 출력해 보면 동일한지 서로 다른지 판단 가능할것 같네요. 실제 생성되는 쿼리를 한번 출력해 보세요. - 박응용님, 2021년 7월 22일 9:51 오전 추천 , 대댓글
@박응용님 죄송합니다; 쿼리란 뭔가요? 데이터베이스의 질의문??인가요? 쿼리출력도 어떻게 하는지 잘 모르겠습니다. 초보자라.. 가르쳐주실수 있나요? - HJ님, 2021년 7월 22일 9:55 오전 추천 , 대댓글
@HJ님 아래 답변 내용 참고해 주세요. - 박응용님, 2021년 7월 22일 7:08 오후 추천 , 대댓글

궁금하신 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 오후