- Django Rest Framework
[Custom User]
Django 에서는 기본적으로 사용자 모델인 User 모델을 제공하고 있다.
하지만 임의로 원하는 필드(ex. 닉네임이나 생일 등)를 가진 사용자 모델을 사용하기 위해서는 custom user 모델을 구현할 수 있다.
- Custom User | models.py
- custom user 모델을 구현하기 위해서는
- BaseUserManager와
- AbstractBaseUser 클래스를 상속받아 새롭게 구현해야 한다.
-> from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
- BaseUserManager : 유저를 생성하는 역할을 하는 헬퍼 클래스이고,
- AbstractBaseUser : 실제 모델이 상속받아 생성하는 클래스입니다.
1-1) class UserManager(BaseUserManager):
- create_user와 create_superuser 함수를 통해 일반 user와 관리자 user 객체를 생성하는 코드를 작성해주었습니다. (is_admin의 차이)
1-2) class User(AbstractBaseUser):
- 사용자 모델에 필요한 field를 작성해주었고, USERNAME_FIELD, REQUIRED_FIELDS를 설정해주었습니다.
- 참고로 is_active와 is_admin field는 Django User 모델의 필수 field
- is_active = models.BooleanField(default=True)
- is_admin = models.BooleanField(default=False)
👉 이후, 정의된 커스텀 유저 모델을 장고 어드민 으로 등록해줘야 한다.
- Custom User | serializers.py
이렇게 models.py 에서 custom user model을 만들었으면 → serializers.py에서 json형태로 입력 받을 fileds를 정의해준다.
+ UserSerializer에서는 주의해야 할 점은, 바로 create 시 (회원가입 시) 입력받은 데이터를 검증해주어야 한다.
(유효하지 않은 값의 입력을 방지하기 위해)
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = "__all__" # user 모델에서 정의한 objects들 다 가져오고
def create(self, validated_data): # 유저 생성시 입력받은 데이터를 검증
user = super().create(validated_data)
password = user.password
user.set_password(password)
user.save()
return user
- Custom User | views.py
serializers.py 에서 생성된 객체의 정보를 json형태로 받아왔으면, views.py 에서 해당 정보를 이용해 서버에서 어떻게 써먹을지 정의해줘야 됨
class UserView(APIView):
def post(self, request):
serializer = UserSerializer(data=request.data) # serializers.py에서 정의된 class 를 이용한다.
if serializer.is_valid():
serializer.save()
return Response({"message":"가입완료!"}, status=status.HTTP_201_CREATED)
else:
return Response({"message":f"${serializer.errors}"}, status=status.HTTP_400_BAD_REQUEST)
[참고 링크]
https://docs.djangoproject.com/en/4.1/topics/auth/customizing/
'woncoding > TIL' 카테고리의 다른 글
| TIL | 11.7.월 [Django : DRF] (0) | 2022.11.09 |
|---|---|
| TIL | 11.4.금 [Django : DRF] (0) | 2022.11.08 |
| TIL | 11.2.수 [AWS] (0) | 2022.11.04 |
| TIL | 11.1.화 [AWS] (0) | 2022.11.03 |
| TIL | 10.31.월 [Django : DRF] (0) | 2022.10.31 |