반응형
스파르타 코딩클럽 내일배움캠프 AI 웹개발자양성과정 3회차
2022.10.14. 31일차 - TIL
1. Django 복습반
- 회원가입 위한 모델 구현
Django에는 권한 및 인증에 대한 기본적인 기능들을 제공하고 있다. 물론 직접 User 모델을 생성해 하나부터 열까지 다 만들 수 있지만 필요한 권한 및 인증 등을 모두 구현해야 하기 때문에 Django에서 제공하는 User Model을 이용해 쉽게 로그인 등의 기능을 구현할 수 있다. 필요로 하는 사용자 데이터가 다를 수 있기 때문에 해당 기능들을 수정해 사용한다. User Model 확장 방법은 총 4가지가 있다. 주로 3, 4번이 많이 사용된다. 위에 두개는 그냥 그렇구나 하는 정도 로 이해하고 넘어가자.
1) Proxy Model
- 테이블 추가, 변경없이 단순히 상속만 하는 방식
- 정렬순서나 필요한 메소드만 추가해 사용
- 기존 User Model에 추가적인 사용자 정보를 저장할 필요가 없을 때 사용하는 가장 간단한 방법
2) One-to-One connection
- 모델(테이블)을 추가해 기존 User Model과 일대일로 연결시켜 사용자 정보 저장
- Django 인증 시스템을 그대로 활용해 로그인, 권한 부여 등과 상관없이 사용자 데이터 저장하기에 간단함
3) AbstractUser 모델
- AbstractUser Model을 상속한 User Model을 새로 정의
- 기본 로그인 인증처리 부분은 Django의 것을 그대로 이용 가능, 사용자 정의 필드 추가 가능
- settings.py에 AUTH_USER_MODEL = '앱이름.사용자모델명' 추가 필요
- 기본적인 User Model : 각 컬럼명과 타입들이 모두 정해져 있다.
● id : PK, 필수, int형
● username : 이름(전체), 필수, char
● first_name : 성, 필수 X, char
● last_name : 이름, 필수 X, char
● email : 이메일, 필수 X, char
● password : 암호화된 비밀번호, 필수, char
● is_staff : admin접속 가능 여부, 필수, bool
● is_activate : 계정 활성 여부, 필수, bool
● s_superuser : 모든 권한 활성 여부, 필수, bool
● last_login : 마지막으로 로그인한 시간, 필수, datetime
● date_joined : 계정이 생성된 날짜, 필수, datetime
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
class Meta:
db_table = '테이블명' //create table
phone = models.IntegerField(default=0)
address = models.TextField(max_length=100, blank=True)
기본적으로 나는 이 3번째로 프로젝트를 진행하다가 기존에 정의된 컬럼명을 사용하고 싶지 않았다. 그래서 작성한 코드가 다음과 같다.
8 lines (15 sloc) 968 Bytes
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class User(AbstractUser):
class Meta:
db_table = 'user'
user_id = models.AutoField(primary_key=True) # 유저 모델의 아이디(기본키)
email = models.EmailField('user email address', db_column='user_email', unique=True) # 유저 이메일 주소
user_nickname = models.CharField('user nickname', max_length=24, unique=True) # 유저의 닉네임
user_phone = models.IntegerField('user phone number', default=0) # 유저 휴대폰번호
username = models.CharField('user real name', db_column='user_name', max_length=24) # 유저 실제 이름
user_bio = models.TextField('user profile status message', default='') # 유저 자기소개
user_profile_image = models.TextField('user profile image', default='') # 유저 프로필 이미지
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
이렇게 작성하면 db_table에는 email과 username이 내가 원하는 user_email과 user_name으로 들어가지만 모델에서 정의할 때는 저렇게 적어야지 안 그러면 에러난다.(아무래도 django에서 해당 필드명으로 여러가지 메소드들을 정의해 놓아서 그렇지 않은가 싶다...) 심지어 저렇게 내 마음대로 필드명을 변경하면 admin 페이지에서 superuser 로그인도 안된다... 그래서 아예 필드명도 내 마음대로, 내가 자유롭게 커스텀하고 싶다면 4번의 방법으로 진행하기를 추천한다.
4) AbstractBaseUser
- 이것도 마찬가지로 User 모델을 상속받기에 아래와 같은 기본적인 필드를 제공받는다.
- Django의 기본 그룹, 허가권 관리 기능 등을 위해 PermissionMixin도 함께 상속
- 기본적인 User Model
● username
● password
● email
● first_name
● last_name
# models.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
class UserManager(BaseUserManager):
use_in_migrations = True
def create_user(self, email, organization, password):
if not email:
raise ValueError('must have user email')
if not password:
raise ValueError('must have user password')
user = self.model(
email=self.normalize_email(email),
organization=organization
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, organization, password):
user = self.create_user(
email = self.normalize_email(email),
organization=organization,
password=password
)
user.is_admin = True
user.is_superuser = True
user.save(using=self._db)
return user
class User(AbstractBaseUser, PermissionsMixin):
objects = UserManager()
email = models.EmailField(
max_length=255,
unique=True,
)
# 추가하고 싶은 다양한 사용자 필드
organization = models.CharField(max_length=30)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['organization']
def __str__(self):
return self.email
@property
def is_staff(self):
return self.is_admin
반응형
'개발일지 > AI 캠프' 카테고리의 다른 글
내일배움캠프 AI - 32일차 TIL, 2022.10.17 (0) | 2022.10.18 |
---|---|
내일배움캠프 AI - 7주차 WIL (0) | 2022.10.17 |
내일배움캠프 AI - 30일차 TIL, 2022.10.13 (0) | 2022.10.13 |
내일배움캠프 AI - 29일차 TIL, 2022.10.12 (0) | 2022.10.13 |
내일배움캠프 AI - 28일차 TIL, 2022.10.11 (0) | 2022.10.12 |