✅ Django QuerySet의 논리 평가와 get_context_data 코드 완전 이해하기
1. 💡 핵심 질문
UserFollowing.objects.filter(...)는 그냥 QuerySet을 반환할 뿐인데, 어떻게 조건문 없이도 if에서 True/False처럼 판단이 가능할까?
2. 🔍 코드 예제 분석
✅ 예시 코드 (Django CBV에서 사용)
def get_context_data(self, **kwargs):
data = super().get_context_data(**kwargs)
if self.request.user.is_authenticated:
data['is_follow'] = UserFollowing.objects.filter(
to_user=self.object,
from_user=self.request.user
)
return data
✅ 이 코드의 목적
- 현재 로그인한 유저가 **지금 보고 있는 유저(self.object)**를 팔로우하고 있는지 확인
- 그 결과를 템플릿에서 사용할 수 있도록 context에 is_follow로 넘김
3. 🧠 QuerySet은 왜 조건 없이도 True/False처럼 동작할까?
✅ 파이썬 내부 동작 이해
Django의 QuerySet은 다음처럼 평가됩니다:
qs = UserFollowing.objects.filter(...)
if qs:
print("결과 있음")
else:
print("결과 없음")
▶️ 그 이유는 QuerySet 클래스 안에 다음이 정의되어 있기 때문입니다:
- __len__() 또는 __bool__() 메서드 → 비었는지 아닌지에 따라 Boolean 값처럼 동작
- 결과가 1개 이상이면 → True
- 결과가 비어있으면 → False
✅ 예시
qs = User.objects.filter(nickname='admin')
if qs:
print("admin 유저가 존재함")
else:
print("admin 유저 없음")
이렇게 사용할 수 있습니다.
4. ⚠️ BUT! 더 좋은 방법은 exists()
✅ exists() 활용법
is_follow = UserFollowing.objects.filter(
to_user=self.object,
from_user=self.request.user
).exists()
메서드 반환값 용도
.filter() | QuerySet 객체 | 여러 개 가져오거나 반복할 때 |
.exists() | Boolean 값 | 존재 여부만 확인할 때 ✅ |
✅ 성능 차이
- .filter()는 실제 DB에서 데이터를 여러 건 가져옴
- .exists()는 SQL 쿼리 자체가 "하나라도 존재하는가"만 판단 → 더 빠름!
📌 예: SELECT 1 FROM ... WHERE ... LIMIT 1;
5. 🎯 템플릿 연동 예시
✅ context에 값 전달
data['is_follow'] = UserFollowing.objects.filter(...).exists()
✅ 템플릿에서 사용
{% if is_follow %}
<button>언팔로우</button>
{% else %}
<button>팔로우</button>
{% endif %}
6. ✅ 요약 정리
개념 설명
QuerySet 자체를 if에서 사용 | 내부적으로 빈지 아닌지 판단해서 True/False로 작동함 |
더 정확한 방법 | .exists()를 사용하면 명확하고 빠름 |
템플릿에서 활용 | context에 Boolean으로 넘기면 분기처리 쉬움 |
필요하시면 이 내용을 기반으로 Follow/Unfollow API, 버튼 이벤트 처리까지 확장도 도와드릴게요 😊
'기술블로그-Django편' 카테고리의 다른 글
✅ Django 검색 뷰 함수 완전 분석: search() 함수 흐름 이해하기 (0) | 2025.05.16 |
---|---|
✅ Django symmetrical 옵션 완전 이해하기 (0) | 2025.05.16 |
📌 Django ORM - get_or_create 완전 정복 (0) | 2025.05.16 |
📌 Django 클래스 기반 뷰(CBV)의 흐름 완전 이해 + AJAX 연동 설명 (0) | 2025.05.16 |
📌 Django에서의 팔로우 기능 모델링 완전 정복 (0) | 2025.05.16 |