해결된 질문
작성
·
151
답변 1
1
안녕하세요.
django.contrib.auth 앱에서는 기본 User 모델을 제공해주고 있구요. 우리의 장고 프로젝트에서는 Custom User 모델을 정의하여, 이를 프로젝트의 User 모델로 지정할 수 있습니다.
프로젝트의 User 모델로 정의하는 방법은 settings 내에 AUTH_USER_MODEL 문자열 값을 설정하는 것이죠. 포맷은 "앱이름.모델명" 형식의 문자열입니다.
프로젝트에서 User 모델을 변경될 수 있습니다. 변경될 수 있기에 django.contrib.auth 앱의 User 모델을 직접 임포트하는 것은 적절하지 못한 접근입니다. 프로젝트에 따라 User 모델이 변경될 수 있기 때문이죠. 대개의 장고 프로젝트에서는 Custom User 모델을 정의하여 사용합니다.
위에서 살펴본 바와 같이 현재 프로젝트에 설정된 User 모델 클래스를 참조하는 방법은 settings.AUTH_USER_MODEL 문자열 값을 통해 모델 클래스를 임포트하는 것입니다.
장고의 모델 관계필드(models.ForeignKey, ManyToManyField, OneToOneField)에서는 관계되는 모델 클래스를 문자열로 지정할 수도 있고, 직접적으로 모델 클래스를 지정하실 수도 있습니다. 문자열로 지정하면, 장고 내부적으로 해당 클래스를 임포트하여 지정됩니다.
그러니,
1. User를 직접 호출 => 프로젝트에 따라 User 모델 클래스가 바뀔 수 있기에, 적절치 못한 접근입니다.
2. settings.AUTH_USER_MODEL 문자열 => 관계필드는 문자열로도 지정할 수 있기에 이 방법은 유효한 방법입니다.
3. get_user_model() => 내부적으로 settings.AUTH_USER_MODEL 값을 참조하여 모델 클래스를 반환합니다. 이 방법 역시 유효한 방법입니다.
- get_user_model 코드 보기 : https://github.com/django/django/blob/4.0.6/django/contrib/auth/__init__.py#L170
코드를 쓰실 때
User 모델 클래스가 직접적으로 필요하시면 get_user_model() 을 통해 User 모델 클래스를 임포트하여 사용하시면 되구요.
관계필드에 User 모델 클래스를 지정하실 때에는 2번/3번 방법 둘 다 됩니다.
화이팅입니다. :-)
ps. 본 질문이 해결되셨다면, 본 질문의 상태를 해결됨으로 변경 부탁드립니다.