✅ Django ORM 필드 룩업 완전 정복: nickname__icontains vs tags__tag 차이 이해하기
1. 🎯 왜 헷갈릴까?
둘 다 이렇게 생겼습니다:
nickname__icontains='cha'
tags__tag='news'
- 문법 구조는 동일 (필드__옵션, 필드__필드)
- 하지만 하나는 단순 필드 조건, 다른 하나는 관계 모델을 타고 들어가는 조건
그래서 모양은 같지만 의미는 전혀 다릅니다.
2. 🧠 핵심 차이 요약
항목 nickname__icontains tags__tag
시작 단어 | nickname | tags |
의미 | 현재 모델의 필드 | 관계 모델(Tag)을 따라감 |
필드 타입 | CharField | ManyToManyField |
조건 처리 | 문자열 안에 포함 여부 | 연결된 태그 객체 중 조건 일치 여부 |
3. 🔍 각각의 예시와 의미
✅ 1) nickname__icontains='cha'
User.objects.filter(nickname__icontains='cha')
- User 모델 안의 nickname 필드에 'cha'가 포함된 사람 찾기
- 대소문자 구분 없이 부분 문자열 검색
예: 'chanyeol', 'Chaerin', 'matcha' 등도 모두 포함됨
➡️ 단순 문자열 필드에서 필터 조건 적용
✅ 2) tags__tag='news'
Post.objects.filter(tags__tag='news')
- Post 모델이 ManyToMany로 연결한 Tag 모델 중
- tag='news'인 태그가 하나라도 연결된 Post만 필터링
➡️ 관계(Relation)를 따라가서 조건 적용
4. 🧱 ERD(관계도) 시각화
User
└── nickname: CharField
Post
└── title: CharField
└── tags: ManyToManyField → Tag
Tag
└── tag: CharField
- User: 닉네임을 가진 사용자
- Post: 여러 Tag와 연결됨 (N:N 관계)
- Tag: 태그 이름을 가진 객체
➡ tags__tag는 Post → Tag 연결을 따라가서 조건을 거는 방식입니다.
5. 💡 Django ORM 룩업 방식 정리
유형 문법 예시 설명
필드 자체 조건 | nickname__icontains='cha' | 현재 모델의 필드에 대한 조건 처리 |
관계 모델 조건 | tags__tag='news' | 관계를 타고 들어가서 조건 처리 (JOIN 개념) |
6. 📌 비유로 이해하기
표현 비유
nickname__icontains='cha' | 이 사람의 "이름표"(nickname)에 'cha'가 들어 있나요? |
tags__tag='news' | 이 사람이 붙이고 있는 "스티커들" 중 'news'라는 게 있나요? |
✅ 마무리 요약
- __는 필드 조건뿐 아니라 관계를 따라가는 도구로도 쓰입니다.
- 첫 단어가 "일반 필드"냐 "관계 필드"냐에 따라 완전히 다른 동작을 합니다.
- ERD와 구조를 먼저 이해하면 훨씬 쉽게 구분할 수 있어요!
필요하시면 이걸 SQL 쿼리로 비교하거나, 템플릿에서 사용하는 방식도 추가해드릴게요 😊
'기술블로그-Django편' 카테고리의 다른 글
📌 Django-summernote - WYSIWYG 에디터 통합 가이드 (0) | 2025.05.16 |
---|---|
📌 Django ImageField 완전 정리 - 이미지 업로드 기능 구현 가이드 (0) | 2025.05.16 |
✅ Django 검색 뷰 함수 완전 분석: search() 함수 흐름 이해하기 (0) | 2025.05.16 |
✅ Django symmetrical 옵션 완전 이해하기 (0) | 2025.05.16 |
✅ Django QuerySet의 논리 평가와 get_context_data 코드 완전 이해하기 (0) | 2025.05.16 |