User 관리하기

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

학습주제
User관리하기

학습내용
앞으로 이용할 사용자를 관리하는 기능을 구현
먼저 이 user 모델에 대해 시리얼라이저를 만들고, view를 구현

polls_api serializers.py로 이동
사용자를 import
from django.contrib.auth.models import User

새로운 클래스 생성

	questions = serializers.PrimaryKeyRelatedField(many=True, queryset=Question.objects.all())
   class Meta:
       model = User
       fields = ['id', 'username', 'questions']

우리가 적은 시리얼라이저의 PrimaryKeyRelatedField에 대해 좀 더 자세히 알아보려고 한다.
class Album은 트랙을 여러개 갖는데, 그래서 many=True로 지정되고
설명을 보면
many = to-many relationships
이 앨범의 ID를 통해서 여러개의 트랙들을 가지게 됨.

코드로 돌아가서
이 유저의 ID를 통해서(Primary Key) 여러개의 questions를 갖고 있다. 라는 것을 시리얼라이저에 명시해준 것이다.

장고 쉘에서는 Question.choice_set.all()을 통해 Question 모델에서 초이스 내에 있는 vote 등에도 바로 접근이 가능했었다. 내부적으로 쿼리문이 돌아 DB의 다른 테이블에 접근했기 때문이다.

question을 가지고 오는 필드의 정보는 user 테이블에 있는 것이 아님. Question테이블에서 User_id라는 필드가 있는 것이고 그걸 통해서 User는 questions를 불러옴
user.questions.all().query
WHERE "polls.question"."owner_id" = 1 User에 있는 어떤 칼럼을 보는 것이 아니라 Question의 owner_id 칼럼을 통해서 이를 보고 user내의 id와 비교하여 불러옴

하지만 시리얼라이저의 경우 이렇게 자기 칼럼을 보는 것이 아니니까 별도로 쿼리문처럼 PrimaryKeyRelatedField처럼 현재 내 시리얼라이저 User의 id값을 이용해 queryset=Question의 집합 중 owner_id == User_id인 questions를 리턴받는 변수 questions를 직접 만들어주어야. 비로소 시리얼라이저는 이 변수를 통해 접근이 가능하다.

이제 생성한 시리얼라이저를 view에 부르기 위해 import한다
UserSerializer, User

클래스 2개를 만들어준다.

class UserList(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class UserDetail(generics.RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

지난번과 동일하다. CRUD기능은 상속받아 사용한다.
이제 이 view를 url과 연결해준다.

연결하고 새로고침을 하니 오류가 났다.

fields 속성을 지정하지 않았다고 하는데 보통은 타이핑 오류다. 검색하다보니 나와 같은 오류가 있었다.

보니까 fields라고 써야하는데 field라고 적었다.

수정 하니 정상적으로 뜬다

오류메세지를 잘 읽어보면 좋다.

다음엔 일반 사용자를 만들어본다

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

0개의 댓글