기술블로그-Django편
🧪 Django shell로 클래스/메서드 유효성 확인하는 방법 총정리
Chansman
2025. 5. 19. 15:51
🧪 Django shell로 클래스/메서드 유효성 확인하는 방법 총정리
Django 개발 중 특정 클래스나 매니저, 메서드가 현재 버전에서 존재하는지, 호출 가능한지 확인하고 싶을 때, shell에서 직접 검증하는 방법을 정리합니다.
✅ 1. 기본 흐름 요약
단계 설명 예시 명령어
1단계 | shell 진입 | python manage.py shell |
2단계 | 클래스 임포트 | from django.contrib.auth.models import BaseUserManager |
3단계 | dir() 확인 | dir(BaseUserManager) |
4단계 | hasattr()로 유무 체크 | hasattr(BaseUserManager, 'make_random_password') |
5단계 | 직접 호출 테스트 | BaseUserManager().make_random_password() |
🔍 2. 예시 1: make_random_password() 유효성 확인
from django.contrib.auth.models import BaseUserManager
# 1. 해당 클래스의 모든 속성 확인
print(dir(BaseUserManager))
# 2. 해당 메서드가 있는지 직접 확인
print(hasattr(BaseUserManager, 'make_random_password')) # ✅ True or False
# 3. 실제로 호출 가능 여부 확인
print(BaseUserManager().make_random_password()) # 정상 출력 or AttributeError
📌 Django 5.x 이후 해당 메서드가 제거되어 False가 나올 수 있음
🧪 3. 예시 2: 커스텀 User 모델 매니저에서 메서드 유효성 확인
from django.contrib.auth import get_user_model
User = get_user_model()
# 매니저 타입 확인
print(type(User.objects)) # <class 'member.models.UserManager'> 등
# 메서드 유무 확인
print(hasattr(User.objects, 'make_random_password')) # True or False
추가적으로 전체 메서드 확인:
print(dir(User.objects))
🧠 4. 예시 3: 템플릿 필터, 커스텀 클래스 유효성 확인도 가능
커스텀 필터 확인
from django.template.defaultfilters import slugify
hasattr(slugify, '__call__') # True면 함수처럼 호출 가능
커스텀 Form 필드 메서드 확인
from myapp.forms import MyForm
form = MyForm()
hasattr(form.fields['email'], 'clean')
🛠️ 5. 유효성 점검 체크리스트
✅ shell 진입 후 아래 순서로 점검:
- type(obj) → 실제 클래스 확인
- dir(obj) → 포함된 메서드/속성 리스트 확인
- hasattr(obj, 'method') → 존재 여부 확인
- callable(obj.method) → 함수형 메서드인지 확인
- obj.method() → 실제 호출 테스트
🎯 6. 실무에서 자주 점검하는 대상들
확인 대상 관련 예시
모델 매니저 메서드 | User.objects.custom_query() 존재 여부 |
Django 내장 필터 | slugify, truncatechars, intcomma 등 호출 가능 여부 |
Form 필드 속성 | form.fields['email'].label 존재 여부 |
View 클래스 메서드 | MyView.get() 오버라이드 여부 |
✅ 정리
Django shell은 단순 테스트용이 아니라, 실제 코드가 현재 버전에서 어떤 구조를 갖고 있는지 확인하고, 디버깅하는 데 매우 강력한 도구입니다.
앞으로 라이브러리 업그레이드나 커스텀 클래스 사용 시에도 위 방식으로 유효성을 빠르게 점검하세요!