A ship in harbor is safe, but that is not what ships are built for.

개발일지/AI 캠프

내일배움캠프 AI - 31일차 TIL, 2022.10.14

플리피나리 2022. 10. 17. 20:31
반응형

스파르타 코딩클럽 내일배움캠프 AI 웹개발자양성과정 3회차

2022.10.14. 31일차 - TIL

 

 

1. Django 복습반

  1. 회원가입 위한 모델 구현
    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
반응형