✅ Django에서 User 모델을 참조하는 두 가지 방식 비교

2025. 5. 14. 16:51·기술블로그-Django편

✅ Django에서 User 모델을 참조하는 두 가지 방식 비교

Django 프로젝트를 진행하다 보면 User 모델을 다른 앱에서 참조해야 하는 상황이 자주 발생합니다. 이때 보통 두 가지 방식 중 하나를 사용하게 됩니다:

# 방식 1 (admin.py)
from member.models import User

# 방식 2 (models.py 등)
from django.contrib.auth import get_user_model
User = get_user_model()

1️⃣ 두 방식의 차이점 비교

구분 방식 1: from member.models import User 방식 2: User = get_user_model()

사용 시점 모델 정의, admin 등록 등 내부 고정 사용 앱 간 참조, 유연한 확장 필요 시
유저 모델 접근법 직접 import (정적 접근) settings.AUTH_USER_MODEL 기반 (동적 접근)
커스텀 User 대응 한정적 (외부 앱에서 충돌 우려) 안전함 (설정된 모델 자동 인식)
추천 상황 같은 앱 내에서 확실한 사용 시 다른 앱, 외부 모듈, 재사용 코드 시

2️⃣ 방식 1: 직접 import (from member.models import User)

📍 사용 예시:

# member/admin.py
from member.models import User

@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    pass

✔️ 장점:

  • 직접 정의한 User 모델을 확실하게 가져옴
  • admin 등록 시 명확한 참조가 가능함

❌ 주의점:

  • 커스텀 유저 모델 변경 시 다른 앱에서 오류 발생 가능
  • settings.py의 AUTH_USER_MODEL 설정과 충돌할 수 있음

3️⃣ 방식 2: get_user_model() 함수 사용

📍 사용 예시:

# post/models.py
from django.contrib.auth import get_user_model
User = get_user_model()

class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)

✔️ 장점:

  • 설정된 AUTH_USER_MODEL 값을 동적으로 불러옴
  • 다양한 앱에서도 항상 일관된 User 모델을 참조 가능
  • 다른 프로젝트로 코드 복사 시 호환성 우수

💡 get_user_model()은 다음 설정을 기반으로 작동합니다:

# settings.py
AUTH_USER_MODEL = 'member.User'

❌ 주의점:

  • 앱 초기 실행 이전에 사용 시 Circular Import 발생 가능성 (주의 깊게 사용)

4️⃣ Django 권장 방식은?

"외부 앱, models.py, views.py, forms.py 등에서는 항상 get_user_model() 사용을 권장합니다."

✅ Django 공식 문서에서도 커스텀 유저 모델 대응을 위해 get_user_model() 사용을 적극 권장합니다.


🔚 정리: 언제 어떤 방식을 써야 하나요?

상황 추천 방식

admin.py에서 모델 등록 시 from member.models import User
다른 앱에서 User를 FK로 참조할 때 get_user_model()
폼, 뷰, API 등 재사용성이 있는 코드 get_user_model()
외부 라이브러리, 패키지 코드 get_user_model()

📌 실전 팁

  • admin.py와 같이 앱 내부 전용 코드에서는 직접 import가 간편합니다.
  • 다른 앱 간 협업, 유지보수성, 확장성을 고려할 경우엔 **get_user_model()**이 필수입니다.

이제 상황에 맞는 방식으로 User 모델을 올바르게 참조해 보세요!
장고의 유연함을 잘 활용하면 프로젝트 유지보수와 협업이 훨씬 쉬워집니다 💡

'기술블로그-Django편' 카테고리의 다른 글

🔍 Django ORM 쿼리 최적화 - select_related vs prefetch_related  (0) 2025.05.14
📂 Django에서 MEDIA_URL과 MEDIA_ROOT 설정 완벽 이해하기  (0) 2025.05.14
📂 Django 모델에서 str() 함수 작동 흐름 완벽 해설  (0) 2025.05.14
📬 Django 이메일 전송 및 보안 서명 처리  (0) 2025.05.14
🧭 Django CBV(Class-Based View) + 요청/응답 흐름 정리  (0) 2025.05.14
'기술블로그-Django편' 카테고리의 다른 글
  • 🔍 Django ORM 쿼리 최적화 - select_related vs prefetch_related
  • 📂 Django에서 MEDIA_URL과 MEDIA_ROOT 설정 완벽 이해하기
  • 📂 Django 모델에서 str() 함수 작동 흐름 완벽 해설
  • 📬 Django 이메일 전송 및 보안 서명 처리
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (800) N
      • Python (32)
      • 프로젝트 (115) N
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (154)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
✅ Django에서 User 모델을 참조하는 두 가지 방식 비교
상단으로

티스토리툴바