User 추가하기

data_hamster·2023년 4월 29일
0
post-custom-banner

학습주제
Part2: 사용자와 인증

학습내용
이번엔 우리가 만든 Question모델에 작성자를 추가하고 작성자만 자신의 제목을 수정할 수 있게 한다.

장고에서 제공하는 사용자 관리에 대해 알아본다. 우리는 admin을 통해 super유저를 생성한 적이 있다.

복습하자면 커맨드에서
python manage.py createsuperuser
Username :
Password :

이 유저가 어떻게 동작하는지는 settings.py를 보면 INSTALLED_APPS에 .admin이나 .auth같은 값들이 추가되어 있다.
.admin이 있기에 admin 페이지를 생성할 수 있고
.auth가 있기에 createsuperuser를 통해 user를 만들어 이 유저를 이용해 로그인을 할 수 있었다.

장고 쉘로 돌아가
여기서 user를 불러들여야 한다. INSTALLED_APPS 에서 django.contrib.auth이 부분을 복사해서 장고 쉘에서
from django.contrib.auth.models import User
이렇게 작성해준다.

User 모델을 사용할 수 있다. User 필드를 살펴보려면
User._meta.get_fields()
읽다보면 id, password, last_login, is_superuser, username, first_name, last_name, email 등등 정말 우리가 회원가입 했을때 들어갈만한 정보들이 필드로 제공된다. 하나의 서비스에서 유저를 만드는데 필요한 필드들이 구현되어 있다.
모델은 일종의 테이블

어떤 값이 있는지 살펴보려면
User.objects.all()

지난번에 생성한 admin, admin2가 있다.
이런 유저모델을 Question 모델에서도 사용할 수 있도록 추가해 보려 한다.

vs code로 넘어와 polls의 models.py로 이동
Question 모델에서 필드를 추가한다.
키의 이름은 'auth.User'
owner = models.Foreignkey('auth.User', related_name = 'questions', on_delete=models.CASCADE, null=True)

on_delete=models.CASCADE 만약 이 owner인 유저가 삭제되면 해당 Question도 연쇄적으로 삭제하라는 뜻
choice에서도 똑같이 지정했었음. question이 삭제되면 이 Choice들 모두 삭제하라는 의미.

null=True는 이 필드가 비어있어도 된다.
related_name은 이따 장고 쉘에서 확인

모델을 정의했기 때문에 변경된 모델을 테이블에 반영하기 위해 마이그레이션을 해야한다.
python manage.py makemigrations
owner 필드가 추가되었다고 창에 뜬다.

python manage.py migrate으로 마이그레이트를 한다.

장고 쉘에서 확인을 하려는데 유저는 불러오는 라이브러리 위치는 settings.py INSTALLED APPS의 auth부분을 복사한다.

from django.contrib.auth.models import User
우리는 설치된 앱에서 User를 이용할 것이기 때문에 위의 방법처럼 하는 것이다. Question, Choice도 불러올 것이기에

from polls.models import *
임의의 유저를 불러와본다
user = User.objects.first()
user.questions.all() 앞전에 related name을 questions라고 정의했기에 user에서 question목록에 이렇게 접근할 수있다.
현재는 연결된 값이 없어 비어있다.
쿼리를 살펴보면
print(user.questions.all().query)
이 유저의 모든 퀘스쳔들을 가져오는 쿼리라는 것을 알 수 있다. 그 기준은 owner_id == 1
user.id

choice를 가져올 때랑 똑같은 동작
일전에 question에서 choice 목록을 가져올땐
question.chocie_set.all() 형식으로 가져왔음
choice에서 question 필드를 만들 때 별도의 related_name을 설정해 주지 않았고, 그 이름은 모델(소문자)_set으로 기본 정의된다.

user때는 question_set이 아닌 정의된 이름 questions으로 접근하게 된다.
1대 다 관계에선 그 전체 목록으로 접근 후, 세부목록 접근

이번엔 question들이 어떤 owner 소속이된다.
ForeignKey를 갖고있는(user.id) 모델(question)은 여러개가 된다.
question에 owner 필드가 있고 1개 owner는 여러개의 question 필드를 갖게 된다.

choice는 question 필드를 갖고, 1개의 question은 여러개의 choice를 갖게 된다.
WHERE "polls.choice"."question_id" = 1

WHERE "polls_question"."owner_id" = 2
id와의 관계로 맺어진다.

요약

owner = models.ForeignKey('auth.user', related_name='quesitons', on_delete=models.CASCADE, null=True)
어떤 모델의 key를 사용할 것인지? 'auth.user' 모델의 키.

자연스럽게 접근 시엔 owner_id = user_id를 비교하며 접근

profile
반갑습니다 햄스터 좋아합니다
post-custom-banner

0개의 댓글