작성
·
225
0
안녕하세요?
현재 강의를 다시들으면서 헷갈리는 내용을 정리해 나가고 있습니다.
3분30~4분30초 즈음에 common.py에서
AUTH_USER_MODEL = "accounts.User"로 바꿔주시면서,
원래 default값이 auth.user라고 해주시는데요
이 auth.user가
https://github.com/django/django/blob/6a80fd1465277d465c146cab57ffa41cbae1c5ce/django/contrib/auth/models.py#L402
있는 user클래스가 맞나요?
그래서 원래 장고내부적으로 설정을 하지 않으면 auth.user라는 user모델이 돌아가는 것이고(그래서 migration을 그냥 하면 auth.user로 만들어진 db가 생성되는 것이구요)
우리가 필요에 따라 커스터마이징한 User모델(accounts.user)을 만들어줄 경우 그 커스터마이징한 User모델이 장고프로젝트 내부에서 통용되는 Usermodel이라고 선언을 해주는 작업으로 이해해도 될까요?
+그러면 만약 get_user_model로 user모델을 가져올 경우, 들고와지는 user모델은 settings.AUTH_USER_MODEL에서 선언된 모델이 되는 것인가요?
늘 감사합니다!
답변 2
0
헉.. 늘 빠른 답변에 정말로정말로 감사드립니다. 실례지만 하나만 더 여쭙고 싶은데요ㅠㅠ
최근에 파이썬을 공부하면서 abc(abstract base class)라는 개념을 배웟습니다. 자료구조의 뼈대가 되는 iterable이나 collections같은 클래스를 관리하면서 오로지 자료구조간의 '위계'를 세우기 위하여 사용하는 추상적인 클래스라고 배웠는데요
user모델역시 models.Model > AbstractBaseUser > AbstractUser > User라는식으로 클래스들간의 위계가 세워지더군요.
여기서 abstact라는 부분이 파이썬의 abc, 그러니까 User모델들의 원형(?)이라는 느낌을 주기 위해서 사용하는 것 같은데 맞을까요?(혹은 파이썬이나 개발전체에서 통용되는 abstact의 개념을 그냥 django가 차용한 것일까요?)
또 AbstractBaseUser같은 경우는 password를 관리하던데, AbstractUser에 비해 관리되는 정보가 조금 더 중요해서 Base라는 개념으로 나누어서 관리하는 것일까요?(혹은 password의 암호화와 같은 복잡한 내부로직이 존재하기 때문에 따로 분리해서 다루는 걸까요?)
가끔식 abstact와 Base라는 단어가 장고에서 보이는 것 같은데, 단어들을 볼때마다 비슷한 뉘앙스로 받아들일 수 있다면 훨씬 학습하기가 쉬울 것 같아서 여쭤봅니다..
이런부분은 정말 찾아봐도 나오지가 않더라구요.. 어쩌면 정답이 없을 수도 있는 질문같은데, 강사님의 의견이 궁금합니다!
시간 내주셔서 정말 감사합니다!
0
안녕하세요.
설명하신 내용과 보여주신 User 모델의 코드가 맞습니다.
AUTH_USER_MODEL의 디폴트 값은 "auth.User" 입니다. 그러니 말씀하신 대로 AUTH_USER_MODEL 값을 변경하지 않으면 "auth.User" 설정을 통해, auth 앱의 User 모델을 프로젝트의 User 모델로서 활용하게 되는 것입니다.
https://github.com/django/django/blob/4.0.3/django/conf/global_settings.py#L515
get_user_model 코드를 보시면 settings.AUTH_USER_MODEL을 참조하고 있음을 확인하실 수 있습니다.
https://github.com/django/django/blob/4.0.3/django/contrib/auth/__init__.py#L170
그러니 장고 프로젝트에서는 활성화된 User 모델 클래스가 변경될 수 있기에
get_user_model() 을 통해 현 프로젝트의 User 모델 클래스를 참조하여야하며,
외래키로 지정 시에는 get_user_model()을 지정하시거나 settings.AUTH_USER_MODEL을 지정하시는 것이 맞는 방법입니다.
화이팅입니다. :-)
파이썬의 abc(abstract class)는 부모 클래스의 미구현 추상메서드를 자식 클래스에서 반드시 구현하도록 **강제**하는 기능입니다. 핵심키워드가 **강제**인거죠. 강제할 목적이 없다면 abc없이 단순히 상속만 받으셔도 동작은 합니다.
장고 모델의 Meta.abstract = True 옵션은 위 abc와는 관련이 없구요.
Meta.abstract = True 옵션이 지정된 모델 클래스는 장고 마이그레이션 시에 데이터베이스 테이블을 생성하지 않는다는 선언입니다. 다른 모델 클래스의 부모 클래스로 사용될 클래스에서 주로 사용됩니다.
Abstract / Base 네이밍은 단순히 네이밍일 뿐이며, 이름만으로 어떤 특별한 동작을 하는 것은 아닙니다. 단독으로 사용되지 않고 부모 클래스로 사용된다는 의도를 모델 클래스 이름에 표현한 것입니다.
auth.User 는 다양한 계층으로 상속받아 User 모델을 만드는 데요. 계층 별로 User에 필요한 기능들을 쌓아가고 있습니다. 커스텀을 원하는 계층을 상속받아서 기능을 구현할 수 있도록 다양한 계층을 지원하는 것으로 보실 수 있습니다.
화이팅입니다. :-)