✅ Django QuerySet의 논리 평가와 get_context_data 코드 완전 이해하기

2025. 5. 16. 13:50·기술블로그-Django편

✅ 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
'기술블로그-Django편' 카테고리의 다른 글
  • ✅ Django 검색 뷰 함수 완전 분석: search() 함수 흐름 이해하기
  • ✅ Django symmetrical 옵션 완전 이해하기
  • 📌 Django ORM - get_or_create 완전 정복
  • 📌 Django 클래스 기반 뷰(CBV)의 흐름 완전 이해 + AJAX 연동 설명
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (787)
      • Python (32)
      • 프로젝트 (110)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    chatgpterror
    youngprofessionals
    chinanightlife
    life reflection
    americanlaw
    gpterror
    btsreunion
    bts
    global politics
    btsjungkook
    livebroadcast
    lawsuitculture
    smartphonedurability
    뷔
    urbantrends
    trumpmuskclash
    RM
    newpoliticalparty
    self-growth
    basalcellcarcinoma
    travel ban
    hotcoffeecase
    btscomeback
    btsdischarge
    college reunions
    classaction
    remittance
    titaniumcase
    americaparty
    homebartrend
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
✅ Django QuerySet의 논리 평가와 get_context_data 코드 완전 이해하기
상단으로

티스토리툴바