Backend/Django

[Django] AbstractUser를 사용한 UserModel 확장

mirae.kwak 2022. 7. 6. 11:51

AbstractUser

django에서 제공하는 사용자 모델로 기본적인 사용자 정보에 대해 이미 구현되어 있어 편리하게 관련 기능을 구현할 수 있다. 하지만 추가적으로 필요한 사용자 데이터가 있을 수 있기 때문에 AbstractUser를 커스텀하여 사용할 수 있다.

 

기본적으로 제공하는 필드

  • id : PK
  • username 
  • first_name
  • last_name
  • email
  • password
  • is_staff
  • is_activate
  • is_superuser
  • last_login
  • data_joined

 

User Model Custom

1. AbstractUser에 존재하는 필드 이외에 필요한 필드에 대해서 추가적으로 정의해준다.

- 추가적으로 존재하는 필드가 없긴했지만 새로 정의해주었다.

from django.db import models
from django.contrib.auth.models import AbstractUser


class Users(AbstractUser):
    id = models.AutoField(primary_key=True, db_column='user_id')
    username = models.CharField(max_length=20, unique=True)
    email = models.EmailField(
        verbose_name='email address', max_length=255, unique=True)
    password = models.CharField(max_length=300, null=False)

 

2. 정의한 User Model을 설정한다.

# settings.py
AUTH_USER_MODEL = 'ncteApp.Users'

 

3. admin 페이지에서 확인하기 위해 User Model을 등록한다.

# admin.py
from django.contrib.auth.admin import UserAdmin
from .models import Users


admin.site.register(Users, UserAdmin)

 

내가 겪은 문제

UserModel 설정의 경우 프로젝트를 생성한 초기에 해주는 것이 좋다. User Model을 따로 설정해주면 django가 테이블을 만들 때 auth_user 모델을 생성하지 않고 내가 정의한 모델로 만들어주기 때문이다.

 

즉 테이블을 만들기 전에 설정을 완료해주어야한다.

 

나의 경우 데이터베이스 연결 후 테이블을 이미 만든 후에 설정을 바꾸어 주었는데 makemigrations부터 다시 했지만 계속해서 오류가 났다. 이런 오류,,,,

Unknown column 'users.last_login' in 'field list'

구글링했지만 관련 에러가 많이 없기도 했고 해결책이 딱히 없었다.

 

결국 찾은 방식은 table을 재생성해주기!

프로젝트 완전 초기라 존재하는 데이터가 딱히 없다면 이 방식을 추천한다.

  • migrations 폴더 삭제
  • __pycache__ 폴더 안의 모델관련 파일 삭제
  • database table drop

위를 모두 한 후에 다음 명령어로 테이블을 재생성한다.

python manage.py makemigrations [app name]
python manage.py migrate